指令模板值未更新

时间:2014-05-14 13:04:39

标签: angularjs angularjs-directive angular-directive

我正在设置这样的指令(超时功能就像演示一样):

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部分?

1 个答案:

答案 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);

祝你好运!