在指令中使用$ onChanges挂钩对Isolate Scope单向绑定

时间:2017-10-04 11:00:20

标签: angularjs directive

我有以下指令:

// expose directive
        return {
            restrict: 'E',
            link: linkFn,
            scope: {
                treeModel: "<"
            },
            controller: function ($scope) {
                var vm = this;
            },
            controllerAs: 'vm'
        };

我想要做的是观察treeModel上的更改,因此在我的链接功能中,我执行了以下操作:

function linkFn(scope, element, attrs) {
    scope.$watch('treeModel', function(value){
        if(value instanceof Array){
            scope.tree.jstree(true).settings.core.data = value;
            scope.tree.jstree(true).refresh();
        }
    });
}

在这种情况下有效(此代码第一次执行两次value未定义,但第二次value是一个对象数组),但我想实现{{ 1}}挂钩,因为我计划将我的应用程序迁移到Angular 2,所以我做了以下操作:

$onChanges

然后我从链接功能中删除了// expose directive return { restrict: 'E', link: linkFn, scope: { treeModel: "<" }, controller: function ($scope) { var vm = this; vm.$onChanges = function (changes) { if($scope.treeModel instanceof Array){ $scope.tree.jstree(true).settings.core.data = $scope.treeModel; $scope.tree.jstree(true).refresh(); } }; }, controllerAs: 'vm' }; 代码。

当我尝试这个时,它不起作用,scope.$watch只触发一次未定义值且永远不会像vm.$onChanges那样被触发,{{1}当参数应该是一个对象,其中键是绑定更改的名称时,参数总是未定义的。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

你应该使用$ doCheck,因为$ onChanges只关注参考变化,它没有深入观察:

See this article, which describes the replacement of a watcher with $doCheck

  

虽然可以使用$ onChanges来通知有关绑定引用的更改,但对于没有$ scope的突变,没有简单的方法可以做到这一点。$ watch