Angularjs。在标签 <script> 中的 html 模板内发送变量
Angularjs. Send variable inside html template in tag <script>
我在指令 html 模板中有这个小部件代码。
<script type="text/javascript">
_hcwp = window._hcwp || [];
_hcwp.push({widget:"Stream", widget_id:10862, xid:{{_id}});
(function() {
if("HC_LOAD_INIT" in window)return;
HC_LOAD_INIT = true;
var lang = (navigator.language || navigator.systemLanguage || navigator.userLanguage || "en").substr(0, 2).toLowerCase();
var hcc = document.createElement("script"); hcc.type = "text/javascript"; hcc.async = true;
hcc.src = ("https:" == document.location.protocol ? "https" : "http")+"://w.hypercomments.com/widget/hc/10862/"+lang+"/widget.js";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hcc, s.nextSibling);
})();
此模板中有一个变量 {{_id}}。
但是当angular 渲染此模板时,变量不会在模板内部发送。
在某些时候必须在神殿内发送一个变量进行渲染?
我的指令:
app.directive('hyperComments', function($timeout) {
return {
restrict: 'E',
templateUrl: './templates/hc.html',
replace: true,
scope: {
xid: '='
},
link: function(scope, element, attrs) {
console.log('hello!');
$timeout(function() {
_hcwp = window._hcwp || [];
_hcwp[0]= { widget:"Stream", widget_id: 28172, xid: 31241123};
// HC.widget("Stream", _hcwp);
(function() {
// if("HC_LOAD_INIT" in window)return;
// var HC_LOAD_INIT = true;
console.log('in');
var lang = (navigator.language || navigator.systemLanguage || navigator.userLanguage || "en").substr(0, 2).toLowerCase();
var hcc = document.createElement("script"); hcc.type = "text/javascript"; hcc.async = true;
hcc.src = ("https:" == document.location.protocol ? "https" : "http")+"://w.hypercomments.com/widget/hc/9345/"+lang+"/widget.js";
var s = document.getElementsByTagName("script")[0];
console.log(s);
s.parentNode.insertBefore(hcc, s.nextSibling);
})();
}, 10000);
}
};
});
模板:
由 HyperComments 提供支持的评论
字符串中有不匹配的括号
_hcwp.push({widget:"Stream", widget_id:10862, xid:{{_id}});
无论如何,它在语法上都不正确并且会抛出错误,Angular 不解析 <script>
的内容。
此外,Angular 不处理模板中的 <script>
标记(安全问题或 jqlite 实现的过度简化),因此
app.directive('sample', function () {
return {
scope: {},
controller: function ($scope, $window) {
$scope.bar = 'test';
$window.foo = $scope.bar
},
link: function (scope, element, attrs, ctrl) {
var scriptInane = element.find("script")[0];
var script = document.createElement("script");
script.innerHTML = scriptInane.innerHTML;
scriptInane.parentNode.replaceChild(script, scriptInane);
},
template: '<h1>test</h1><script>console.log(foo); alert(foo);<\/script>'
};
});
添加angular.forEach
以支持多个脚本。如果你有 jQuery 加载,你可以用不那么冗长的方式做同样的事情。
或者您可以在指定全局变量的地方将 <script>
加上另一个(因为 DOM 已经一团糟),这样您就可以跳过 $window.foo =
部分.
无论如何,这似乎是另一种“不要在家里尝试”的做法,可能有更好的方法来嵌入这个小部件。
我在指令 html 模板中有这个小部件代码。
<script type="text/javascript">
_hcwp = window._hcwp || [];
_hcwp.push({widget:"Stream", widget_id:10862, xid:{{_id}});
(function() {
if("HC_LOAD_INIT" in window)return;
HC_LOAD_INIT = true;
var lang = (navigator.language || navigator.systemLanguage || navigator.userLanguage || "en").substr(0, 2).toLowerCase();
var hcc = document.createElement("script"); hcc.type = "text/javascript"; hcc.async = true;
hcc.src = ("https:" == document.location.protocol ? "https" : "http")+"://w.hypercomments.com/widget/hc/10862/"+lang+"/widget.js";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hcc, s.nextSibling);
})();
此模板中有一个变量 {{_id}}。
但是当angular 渲染此模板时,变量不会在模板内部发送。
在某些时候必须在神殿内发送一个变量进行渲染?
我的指令:
app.directive('hyperComments', function($timeout) {
return {
restrict: 'E',
templateUrl: './templates/hc.html',
replace: true,
scope: {
xid: '='
},
link: function(scope, element, attrs) {
console.log('hello!');
$timeout(function() {
_hcwp = window._hcwp || [];
_hcwp[0]= { widget:"Stream", widget_id: 28172, xid: 31241123};
// HC.widget("Stream", _hcwp);
(function() {
// if("HC_LOAD_INIT" in window)return;
// var HC_LOAD_INIT = true;
console.log('in');
var lang = (navigator.language || navigator.systemLanguage || navigator.userLanguage || "en").substr(0, 2).toLowerCase();
var hcc = document.createElement("script"); hcc.type = "text/javascript"; hcc.async = true;
hcc.src = ("https:" == document.location.protocol ? "https" : "http")+"://w.hypercomments.com/widget/hc/9345/"+lang+"/widget.js";
var s = document.getElementsByTagName("script")[0];
console.log(s);
s.parentNode.insertBefore(hcc, s.nextSibling);
})();
}, 10000);
}
};
});
模板:
字符串中有不匹配的括号
_hcwp.push({widget:"Stream", widget_id:10862, xid:{{_id}});
无论如何,它在语法上都不正确并且会抛出错误,Angular 不解析 <script>
的内容。
此外,Angular 不处理模板中的 <script>
标记(安全问题或 jqlite 实现的过度简化),因此
app.directive('sample', function () {
return {
scope: {},
controller: function ($scope, $window) {
$scope.bar = 'test';
$window.foo = $scope.bar
},
link: function (scope, element, attrs, ctrl) {
var scriptInane = element.find("script")[0];
var script = document.createElement("script");
script.innerHTML = scriptInane.innerHTML;
scriptInane.parentNode.replaceChild(script, scriptInane);
},
template: '<h1>test</h1><script>console.log(foo); alert(foo);<\/script>'
};
});
添加angular.forEach
以支持多个脚本。如果你有 jQuery 加载,你可以用不那么冗长的方式做同样的事情。
或者您可以在指定全局变量的地方将 <script>
加上另一个(因为 DOM 已经一团糟),这样您就可以跳过 $window.foo =
部分.
无论如何,这似乎是另一种“不要在家里尝试”的做法,可能有更好的方法来嵌入这个小部件。