在一个指令中更新需要在另一个指令中反映的数据时使用 $apply 是不好的做法吗?
Is it bad practice to use $apply when updating data in one directive that needs to be reflected in another directive?
我有一个容器和 children 指令,它们都会影响通过服务引用的数据。总体思路是,我希望能够单击 child 指令,并按照以下规则让它们成为 "selected"。并能够单击容器指令以清除 select 离子。
基本规则是:
- 一次只能编辑一个child select,除非shift-clicking一个child
- 单击 child(无 shift 键),当其他 selected 时,将清除
其他人和select当前的
- 单击 已经 select 编辑 的 child 不会取消 select child
- shift 单击 child 将仅切换 child
- 在 child(在容器中)外单击应该会清除所有 select 离子
以上所有规则实施起来都非常简单。我 运行 遇到的主要麻烦是最后一条规则。单击容器实际上会将 selected 值设置为 false,但是 UI 直到下一个用户操作才会更新。让容器的点击事件将对服务的调用包装在 $apply, "fixed it".
中
.directive('myContainer', function (dataService) {
return {
restrict: 'A',
scope:{data:"="},
link:function(scope, element, attrs){
element.bind('click', function() {
scope.$apply(function() {
dataService.clearSelectedChildren();
});
});
}
};
})
但是,我似乎已经准备好 $apply 通常用于数据的外部更新(angular 世界之外)(即对远程服务器的异步调用)?那么,我是否在滥用申请?如果是这样,我还能如何实现我的目标?
这是一个有效的JSFiddle供参考。
当您绑定自己的事件处理程序时...事件 是 在 angular 之外。在 ng-click
angular 之类的指令中,您所做的事情几乎相同。换句话说,你确实需要通知 angular 到 运行 摘要
我有一个容器和 children 指令,它们都会影响通过服务引用的数据。总体思路是,我希望能够单击 child 指令,并按照以下规则让它们成为 "selected"。并能够单击容器指令以清除 select 离子。
基本规则是:
- 一次只能编辑一个child select,除非shift-clicking一个child
- 单击 child(无 shift 键),当其他 selected 时,将清除 其他人和select当前的
- 单击 已经 select 编辑 的 child 不会取消 select child
- shift 单击 child 将仅切换 child
- 在 child(在容器中)外单击应该会清除所有 select 离子
以上所有规则实施起来都非常简单。我 运行 遇到的主要麻烦是最后一条规则。单击容器实际上会将 selected 值设置为 false,但是 UI 直到下一个用户操作才会更新。让容器的点击事件将对服务的调用包装在 $apply, "fixed it".
中.directive('myContainer', function (dataService) {
return {
restrict: 'A',
scope:{data:"="},
link:function(scope, element, attrs){
element.bind('click', function() {
scope.$apply(function() {
dataService.clearSelectedChildren();
});
});
}
};
})
但是,我似乎已经准备好 $apply 通常用于数据的外部更新(angular 世界之外)(即对远程服务器的异步调用)?那么,我是否在滥用申请?如果是这样,我还能如何实现我的目标?
这是一个有效的JSFiddle供参考。
当您绑定自己的事件处理程序时...事件 是 在 angular 之外。在 ng-click
angular 之类的指令中,您所做的事情几乎相同。换句话说,你确实需要通知 angular 到 运行 摘要