2016-02-11 40 views
13

Come si crea un tag script con un oggetto JSON creato dinamicamente in AngularJS.Tag script AngularJS JSON-LD

Questo è quello che mi serve il tag script per assomigliare

<script type="application/ld+json"> 
{ 
    "@context": "http://schema.org", 
    "@type": "Place", 
    "geo": { 
    "@type": "GeoCoordinates", 
    "latitude": "40.75", 
    "longitude": "73.98" 
    }, 
    "name": "Empire State Building" 
} 
</script> 

Ho provato il seguente codice, ma non posso farlo funzionare:

HTML

<div ng-controller="TestController"> 
    <script type="application/ld+json"> 
    {{jsonId|json}} 
    </script> 
    {{jsonId|json}} 
</div> 

controller

var myApp = angular.module('application', []); 

myApp.controller('TestController', ['$scope', function($scope) { 
    $scope.jsonId = { 
    "@context": "http://schema.org", 
    "@type": "Place", 
    "geo": { 
     "@type": "GeoCoordinates", 
     "latitude": "40.75", 
     "longitude": "73.98" 
    }, 
    "name": "Empire State Building" 
    }; 
}]); 

L'espressione all'interno del tag dello script non viene eseguita. L'espressione di fuori del tag script viene eseguito correttamente e viene visualizzato il JSON

Vedere jsfiddle

+0

come si può dire se si esegue o no? è solo un oggetto anon ... – dandavis

+0

@dandavis 'json' è un filtro che emette l'oggetto JSON. Non c'è nessun oggetto JSON tra i tag dello script se si visualizza il sorgente. –

risposta

16

Dopo una tazza di caffè mi sono ricordato v'è un servizio $sce con una funzione trustAsHtml.

ho creato una direttiva che accetta un parametro json per un facile riutilizzo

Si prega di consultare aggiornato e il codice di lavoro di seguito:

HTML

<div ng-controller="TestController"> 
    <jsonld data-json="jsonId"></jsonld> 
</div> 

Javascript

var myApp = angular.module('application', []); 

myApp.controller('TestController', ['$scope', function($scope) { 
    $scope.jsonId = { 
    "@context": "http://schema.org", 
    "@type": "Place", 
    "geo": { 
     "@type": "GeoCoordinates", 
     "latitude": "40.75", 
     "longitude": "73.98" 
    }, 
    "name": "Empire State Building" 
    }; 
}]).directive('jsonld', ['$filter', '$sce', function($filter, $sce) { 
    return { 
    restrict: 'E', 
    template: function() { 
     return '<script type="application/ld+json" ng-bind-html="onGetJson()"></script>'; 
    }, 
    scope: { 
     json: '=json' 
    }, 
    link: function(scope, element, attrs) { 
     scope.onGetJson = function() { 
     return $sce.trustAsHtml($filter('json')(scope.json)); 
     } 
    }, 
    replace: true 
    }; 
}]); 

Ecco un'immagine dell'output dello script

Si prega di consultare aggiornato jsfiddle

enter image description here

+1

Come posso ottenere lo stesso in Angularjs 2. –

+0

@ArvindChavhan Sembra che i tag di script siano rimossi in angular2 se sono all'interno del template html, ecco una domanda riguardante il problema.http: //stackoverflow.com/questions/38088996/add-script-tag-in-angular2-componente-modello ed ecco il link alla richiesta di bug/funzionalità https://github.com/angular/angular/issues/9695 –

1

Tjaart van der risposta di Walt non ha funzionato per me in Google Test Tool. Funzionava con il vero crawler. così ho trovato un'altra soluzione "vecchia scuola", che ha fatto il trucco:

HTML

<script type="application/ld+json" id="json-ld-music-group"></script> 

angolare

var schemaOrg = angular.toJson({ 
    '@context': 'http://schema.org', 
    '@type': 'MusicGroup', 
    ... 
}); 

angular.element(document).ready(function() { 
    var jsonLd = angular.element(document.getElementById('json-ld-music-group'))[0]; 
    jsonLd.innerHTML = schemaOrg; 
}); 
+0

Non mi risulta che usiamo questa soluzione in " scenario del caso reale "come hai affermato. Fai clic sul seguente link https://search.google.com/structured-data/testing-tool#url=https%3A%2F%2Fjsfiddle.net% 2Fvqz31net% 2F1% 2F questo avvierà lo strumento di test dei dati della struttura di googles con l'esempio jsfiddle nella mia risposta. Vedrai Place viene rilevato sul lato destro. Ignora gli errori dato che è jsfiddles i dati del sito web e non l'esempio jsfiddle. Sei sicuro di non aver provato e testato un sito web localhost? –

+0

Hai ragione. Funzionava dopotutto. Google ha avuto un ritardo nell'elaborazione dei risultati di 5 giorni. Non ha funzionato nello strumento Google Test per me. Ho modificato il mio commento precedente. – Karens