AngularJS 脚本标签 JSON-LD
AngularJS script tag JSON-LD
如何在 AngularJS 中使用动态构建的 JSON 对象创建 application/ld+json
script
标签。
这就是我需要的脚本标签的样子
<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>
我尝试了以下代码,但无法正常工作:
HTML
<div ng-controller="TestController">
<script type="application/ld+json">
{{jsonId|json}}
</script>
{{jsonId|json}}
</div>
控制器
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"
};
}]);
脚本标签内的表达式不执行。
脚本标签外的表达式正确执行并显示 JSON
请参阅jsfiddle
喝了杯咖啡后,我想起有一个 $sce
服务,具有 trustAsHtml
功能。
我创建了一个接受 json
参数的指令,以便于重复使用
请查看下面的更新和工作代码:
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
};
}]);
这是脚本输出的图像
请查看更新后的内容jsfiddle
Tjaart van der Walt 的回答在 Google Test Tool 中对我不起作用。它确实适用于真正的爬虫。
所以我找到了另一个 "old-school" 解决方案来解决问题:
HTML
<script type="application/ld+json" id="json-ld-music-group"></script>
Angular
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;
});
如何在 AngularJS 中使用动态构建的 JSON 对象创建 application/ld+json
script
标签。
这就是我需要的脚本标签的样子
<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>
我尝试了以下代码,但无法正常工作:
HTML
<div ng-controller="TestController">
<script type="application/ld+json">
{{jsonId|json}}
</script>
{{jsonId|json}}
</div>
控制器
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"
};
}]);
脚本标签内的表达式不执行。 脚本标签外的表达式正确执行并显示 JSON
请参阅jsfiddle
喝了杯咖啡后,我想起有一个 $sce
服务,具有 trustAsHtml
功能。
我创建了一个接受 json
参数的指令,以便于重复使用
请查看下面的更新和工作代码:
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
};
}]);
这是脚本输出的图像
请查看更新后的内容jsfiddle
Tjaart van der Walt 的回答在 Google Test Tool 中对我不起作用。它确实适用于真正的爬虫。 所以我找到了另一个 "old-school" 解决方案来解决问题:
HTML
<script type="application/ld+json" id="json-ld-music-group"></script>
Angular
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;
});