2016-02-11 16 views
13

Jak utworzyć znacznik application/ld+jsonscript za pomocą dynamicznie budowanego obiektu JSON w AngularJS.Znacznik skryptu AngularJS JSON-LD

To co muszę tag skryptu wyglądać

<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> 

Próbowałem poniższy kod, ale nie mogę zmusić go do pracy:

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" 
    }; 
}]); 

Wyrażenie wewnątrz znacznika skryptu nie jest wykonywane. Wyrażenie poza tagu skrypt wykonuje poprawnie i wyświetla JSON

proszę zobaczyć jsfiddle

+0

jaki sposób można stwierdzić, czy jest on wykonywany, czy nie? to tylko obiekt anon ... – dandavis

+0

@dandavis 'json' to filtr, który wyprowadza obiekt JSON. Nie ma obiektu JSON między znacznikami skryptu, jeśli przeglądasz źródło. –

Odpowiedz

16

Po filiżance kawy pamiętałem jest $sce obsługa z trustAsHtml funkcji.

stworzyłem dyrektywę, która przyjmuje parametr json do łatwego ponownego wykorzystania

proszę zobaczyć aktualizowane i kod działa poniżej:

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 
    }; 
}]); 

Oto obraz wyjściowego skryptu

proszę zobaczyć zaktualizowane jsfiddle

enter image description here

+1

Jak mogę to samo osiągnąć w Angularjs 2. –

+0

@ArvindChavhan Wygląda na to, że tagi skryptów są usuwane w kanale kątowym2, jeśli znajdują się wewnątrz szablonu html, tutaj jest pytanie dotyczące problemu.http: //stackoverflow.com/questions/38088996/add-script-tags-in-angular2-component-template i tutaj jest link do zapytania o błąd/funkcję https://github.com/angular/angular/issues/9695 –

1

Tjaart van der odpowiedź Walta nie działa na mnie w Google Test Tool. Działa z prawdziwym robotem. Więc znalazłem kolejny "old-school" rozwiązanie, które wystarczyły:

HTML

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

kątowa

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

Nie zgadzam się, ponieważ używamy tego rozwiązania w " rzeczywisty scenariusz ", jak stwierdzono. Kliknij poniższy link https://search.google.com/structured-data/testing-tool#url=https%3A%2F%2Fjsfiddle.net% 2Fvqz31net% 2F1% 2F uruchomi w mojej odpowiedzi narzędzie do testowania danych struktury Google'a z przykładowym jsfiddle. Zobaczysz, że Wykryto miejsce po prawej stronie. Zignoruj ​​błędy, ponieważ jest to plik danych jsfiddles, a nie przykład jsfiddle. Czy na pewno nie próbowałeś przetestować witryny localhost? –

+0

Masz rację. W końcu zadziałało. Google miał opóźnienie w przetwarzaniu wyników 5 dni. To po prostu nie zadziałało w moim narzędziu do testowania Google. Zmieniłem mój wcześniejszy komentarz. – Karens

Powiązane problemy