Angularjs 在更新一条指令中需要反映在另一条指令中的数据时,使用$apply是否是一种不良做法?

Angularjs 在更新一条指令中需要反映在另一条指令中的数据时,使用$apply是否是一种不良做法?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我有一个容器和子指令,它们都会影响通过服务引用的数据。总体思路是,我希望能够单击子指令,并根据以下规则“选择”它们。并能够单击container指令以清除选择 基本规则是: 一次只能选择一个子项,除非按住shift键并单击一个子项 选择其他子项时,单击子项(无shift键)将清除 单击“其他”,然后选择当前的一个 单击已选择的子项不会取消选择该子项 按住shift键并单击子项将仅切换该子项 单击子对象外部(容器中)应清除所有选择 上面所有的规则都很容易实现。我遇到的主要麻烦是最后一条规则。单

我有一个容器和子指令,它们都会影响通过服务引用的数据。总体思路是,我希望能够单击子指令,并根据以下规则“选择”它们。并能够单击container指令以清除选择

基本规则是:

  • 一次只能选择一个子项,除非按住shift键并单击一个子项
  • 选择其他子项时,单击子项(无shift键)将清除 单击“其他”,然后选择当前的一个
  • 单击已选择的子项不会取消选择该子项
  • 按住shift键并单击子项将仅切换该子项
  • 单击子对象外部(容器中)应清除所有选择
上面所有的规则都很容易实现。我遇到的主要麻烦是最后一条规则。单击容器实际上会将所选值设置为false,但是直到下一个用户操作,UI才会更新。让容器的click事件将对服务的调用包装为$apply,“fixed it”

然而,我似乎已经准备好了$apply通常用于数据的外部更新(角度世界之外)(即对远程服务器的异步调用)?那么,我是否误用了应用程序?如果是这样,我还能如何实现我的目标


这里有一个工作示例供参考。

当您绑定自己的事件处理程序时,事件是外部事件。在像
ng这样的指令中,click
angular所做的事情与您所做的几乎相同。换句话说,当您绑定自己的事件处理程序时,确实需要通知angular运行摘要

。事件在angular之外。在像
ng这样的指令中,click
angular所做的事情与您所做的几乎相同。换句话说,当DOM事件处理程序在“angular世界”之外执行时,确实需要通知angular运行摘要。因此,您需要调用$apply()是很正常的。这非常有意义。多谢各位@charlietfl,既然你有了第一条评论,如果你提供一个答案,我会接受的。
.directive('myContainer', function (dataService) {
    return {
        restrict: 'A',
        scope:{data:"="},
        link:function(scope, element, attrs){
            element.bind('click', function() {
                scope.$apply(function() {
                    dataService.clearSelectedChildren();
                });
            });
        }
    };
})