范围。$ watch不在angular指令中工作

时间:2015-06-16 08:49:24

标签: javascript angularjs angularjs-ng-repeat watch angular-directive

我制作了一个自定义指令并使用了ng-model,但是当模型更新时,该指令即使我正在观看该事件。这是代码:

angular.module('Directives').directive("customDirective", ['$window', function ($window) {

return {
    restrict: "E",
    require: 'ngModel',
    scope: {
        ngModel: '=',
    },
    link: function (scope, elem, attrs, ngModel) {

        // IF the model changes, re-render
        scope.$watch('ngModel', function (newVal, oldVal) {
            render();
        });

        // We want to re-render in case of resize
        angular.element($window).bind('resize', function () {
            //this does work
            render();
        })

        var render = function () {
            //doing some work here
        };
    }
}}]);

和视图:

<div ng-repeat="product in pageCtrl.productList track by product.id">
<h3>{{ product.name }}</h3>
<custom-directive ng-model="product.recentPriceHistory">
    &nbsp;
</custom-directive>

每当将新值添加到产品recentPriceHistory时,视图都不会更新。

1 个答案:

答案 0 :(得分:7)

默认情况下,将旧值与新值进行比较时,将检查“参考”相等性。但是如果你需要检查价值,那么你需要这样做,

scope.$watch('ngModel', function (newVal, oldVal) {
    render();
}, true);

但问题在于,angular会深入监视ngModel的所有属性以进行更改。如果ngModel变量是一个复杂的对象,它将影响性能。你可以做的是避免这种情况,只检查一个属性,

scope.$watch('ngModel.someProperty', function (newVal, oldVal) {
    render();
}, true);