当我从有界数据派生输出时,为什么我的自定义指令没有更新?

Why does my custom directive not update when I derive the output from the bounded data?

基本上我有一个自定义指令,它有一个独立的范围。我双向绑定一段数据并根据这些数据生成一些输出。例如,数据是两个数字 1 和 3。在指令的 link() 函数中,我创建了一个新数组,生成两个数字之间的序号。我在范围内设置的新数组。在模板中,我对该新数组执行 ng-repeat。如果我更改这两个数字,模板似乎不会接受更改。这是我正在谈论的 jsfiddle 示例:

http://jsfiddle.net/m2jf1Lw7/1/

您可以看到当您点击更改时,没有任何反应。如果您将我的指令的模板更改为:

template: '<ul><li ng-repeat="d in data.list" my-button="d"></li></ul>'

将 "pages" 更改为 "data.list"。如果单击更改,您可以看到列表现在将正确更改。

我是 angularjs 的新手。我看了看是否有与我类似的问题,但找不到。如果格式不正确或操作不正确,我深表歉意。感谢您的任何见解。

'=' 作用域绑定在您传递给它的变量上创建一个监视,在您的例子中是 data。因此 data 中的任何更改都会触发监视并更新隔离范围。

观察对象默认使用等式,深度观察:如果对象引用保持不变,则不是被认为改变了,不管它的内容发生了什么。在您的情况下,您正在更改 data 的内容,而不是对 data 本身的引用。

data.list 相同:当您观看 data.list 然后 $scope.data.list 设置为不同的值时,参考发生变化并且手表被触发。

正如 Nikos 所说,如果你真的想检测 data 变量的所有属性的变化,你需要使用 deep watch 如下:

    ...
    link: function (scope, element, attrs) {
        scope.$watch(function () {
            return scope.data
        }, function () {
            var pages = [];
            for (var i = scope.data.list[0]; i <= scope.data.list[1]; i++) {
                pages.push(i);
            }
            scope.pages = pages;
        }, true); // The third parameter is true for deep watch
    },
    ...

JSFiddle.