Javascript 隔离作用域中断属性$observe
由于这个问题,我有我的nice removeDialog指令: 现在我开始玩隔离示波器。我注意到的第一件事是添加隔离作用域会破坏attr.$observe。当触发器更改时,我不会收到通知Javascript 隔离作用域中断属性$observe,javascript,angularjs,Javascript,Angularjs,由于这个问题,我有我的nice removeDialog指令: 现在我开始玩隔离示波器。我注意到的第一件事是添加隔离作用域会破坏attr.$observe。当触发器更改时,我不会收到通知 homesApp.directive("removeDialog", function ($parse) { return { scope: { }, restrict: 'A', link: function (scope, elem
homesApp.directive("removeDialog", function ($parse) {
return {
scope: {
},
restrict: 'A',
link: function (scope, element, attrs, controller) {
angular.element(element).on('hidden.bs.modal', function () {
scope.$apply(function () {
scope.cancelRemove();
});
});
attrs.$observe('trigger', function (newValue) {
if (newValue) {
angular.element(element).modal('show');
} else {
angular.element(element).modal('hide');
}
});
},
controller: 'DeleteController'
};
});
你能解释一下原因吗?触发器的内容不再绑定到外部作用域。您需要在隔离范围中声明它:
scope: {
trigger: '='
}
这将scope.trigger
绑定到您在应用该指令的元素上定义的实际表达式
这样,attrs.$observe('trigger',function(newValue){…}
应该更改为
scope.$watch('trigger', function (newValue) {
if (newValue) {
angular.element(element).modal('show');
} else {
angular.element(element).modal('hide');
}
});
好的。我想我明白了。不过还有一个问题:如果我使用隔离作用域,我将scope.trigger绑定到实际表达式(这是不带{{}}的表达式),那么当我不使用隔离作用域并使用attrs访问它(表达式带{}})时,触发器会发生什么情况?@dragonfly我不清楚会发生什么。你没有一个实际的例子来说明你正在尝试做什么吗?我的意思是:当使用attrs.$observe('trigger',…)时,我的指令有trigger={expression},而当使用隔离作用域时,我必须将其更改为trigger=expression。我不明白为什么这两种方法都需要{{}@dragonfly我理解你的困惑。angularjs的作者在命名处理插值的API时应该更加明确(例如
attrs.$observe
),因为这是理解整个指令的一个障碍——这已经是一个困难的主题。但是这个评论框太小,无法讨论所有这些,我希望我已经帮到你了!祝你好运。你为什么不试试scope:true
而不是scope:{}
。