我正在设置这样的指令(超时功能就像演示一样):
app.directive('timeRange', function () {
return {
restrict: 'A',
scope: {
sliderId: "@sliderId",
},
template: '<div id="{{sliderId}}"></div>'+
'<p>From: <span>{{fromVal}}</span>'+
'<span style="float:right;">{{toVal}}</span><span style="float:right;">To: </span>'+
'</p>',
link: function (scope, elem, attrs) {
scope.sliderId = 'NewId';
scope.fromVal = '06:00';
scope.toVal = '17:00';
setTimeout(function(){
scope.fromVal = 'Hello';
log("Changed");
}, 2000);
},
};
});
当超时功能运行时,HTML不会更新,值保持在06:00
。如何在变量出现时更新模板?我是否需要以某种方式将其链接到我链接属性的scope
部分?
答案 0 :(得分:5)
我可以在您的示例中看到的唯一问题是您使用的是setTimeout
而不是$timeout
服务。每当您以这种方式更改角度或范围变量时,您将不得不手动调用$scope.$apply()
这就是$timeout
服务为您所做的事情。以下代码的效果更好:
app.directive('timeRange', function ($timeout) {
return {
restrict: 'A',
scope: {
sliderId: "@sliderId",
},
template: '<div id="{{sliderId}}"></div>'+
'<p>From: <span>{{fromVal}}</span>'+
'<span style="float:right;">{{toVal}}</span><span style="float:right;">To: </span>'+
'</p>',
link: function (scope, elem, attrs) {
scope.sliderId = 'NewId';
scope.fromVal = '08:00';
scope.toVal = '17:00';
$timeout(function(){
scope.fromVal = 'Hello';
console.log("Changed");
}, 2000);
},
};
});
请注意注入$timeout
及其使用方式。
在Plunker中查看此内容: http://plnkr.co/edit/KlRAeg6cVhehw2EhWzCK?p=preview
修复原件......
固定的原始代码看起来像(只是一个片段):
setTimeout(function(){
scope.fromVal = 'Hello';
scope.$apply();
console.log("Changed");
}, 2000);
祝你好运!