我有以下指令:
// 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}当参数应该是一个对象,其中键是绑定更改的名称时,参数总是未定义的。
我该如何解决这个问题?
答案 0 :(得分:0)
你应该使用$ doCheck,因为$ onChanges只关注参考变化,它没有深入观察:
See this article, which describes the replacement of a watcher with $doCheck
虽然可以使用$ onChanges来通知有关绑定引用的更改,但对于没有$ scope的突变,没有简单的方法可以做到这一点。$ watch