在一个指令中更新数据需要反映在另一个指令中时,使用$ apply是不好的做法吗?

Ste*_*eve 5 angularjs angularjs-directive

我有一个容器和子指令,它们都会影响通过服务引用的数据.一般的想法是,我希望能够点击子指令,并根据以下规则"选择"它们.并且能够单击容器指令以清除选择.

基本规则是:

  • 除非按住一个孩子,否则一次只能选择一个孩子
  • 单击子项(无shift键),当选择其他项时,将清除其他项并选择当前项
  • 单击选中的子项将不会取消选中该子项
  • 点击一个孩子的班次将仅切换该孩子
  • 单击子项外部(在容器中)应清除所有选择

以上所有规则都非常简单易行.我遇到的主要麻烦是最后一条规则.单击容器实际上会将所选值设置为false,但是在下一个用户操作之前UI不会更新.让容器的click事件在$ apply中包装对服务的调用,"修复它".

.directive('myContainer', function (dataService) {
    return {
        restrict: 'A',
        scope:{data:"="},
        link:function(scope, element, attrs){
            element.bind('click', function() {
                scope.$apply(function() {
                    dataService.clearSelectedChildren();
                });
            });
        }
    };
})
Run Code Online (Sandbox Code Playgroud)

但是,我似乎已经准备好$ apply通常用于外部更新(在角度世界之外)到数据(即对远程服务器的异步调用)?那么,我是否滥用申请?如果是这样,我怎么能够实现我的目标呢?

这是一个有效的JSFiddle供参考.

cha*_*tfl 5

当你绑定自己的事件处理程序...的事件角之外.在像ng-clickangular这样的指令中,你所做的几乎完全相同.换句话说,您需要通知angular运行摘要