【问题标题】:AngularJS Custom directives with multiselection具有多选功能的 AngularJS 自定义指令
【发布时间】:2016-01-17 20:11:34
【问题描述】:

假设我有 2 个指令:“父”(即表)和“子”(tr),我希望能够选择子元素并将它们的列表保留在我的父指令中(我认为控制器是唯一可能的地方,不是吗?)。 我正在处理单击事件以更新存储在我的控制器中的列表,它工作正常,但我也想为选定的项目保留“选定”类,但因为选择也可能由父指令的控制器更改(和在控制器中修改 DOM 是“禁止的”),我能想到的唯一可能性是我的子指令中的观察者。

请看示例:

angular.module('App')
    .directive('parent', function () {
    return {
        scope : {},
        controller: function($scope) {
            this.selectedItems = [];
        }
    }
}).directive('child', function() {
    return {
        require: '^parent',
        link: function(scope, element, attrs, controller) {
            scope.$watchCollection('controller.selectedItems', function() {
                //add or remove 'selected' class here.
            }
        }
    }
});

这不起作用(观察者事件仅在数组引用发生变化而不是单个元素时触发)并且它似乎也没有正确设计,您能否为我提供一个更好的方法来解决这个问题?

更新:

注意 controller.selectedItems 在控制器中被修改,但是子指令似乎没有看到任何变化。

【问题讨论】:

  • 根据您的反馈添加了修复解决方案。

标签: javascript angularjs


【解决方案1】:

在修改控制器中的数组后,我通过调用 $scope.$apply() 来修复它。方法是由 javascript 事件触发的,因此摘要循环可能从未运行过。

如果有人对上述设计有其他建议,请告诉我。

【讨论】:

  • 显然。如果一个变量被控制器修改但在其他地方观察,如果没有 $digest 或 $apply 观察者看不到任何变化。所以问题出在其他地方。在您的 OP 中,为了完全理解问题,缺少代码!
  • 是的,没错。非常感谢您的帮助!
【解决方案2】:

请看: How to deep watch an array in angularjs?

您应该使用 $watch 并将 $watch 的第三个可选参数设置为 true。

        scope.$watch(function(){
            return controller.selectedItems;
            },
            function() {
            //add or remove 'selected' class here.
            },
            true
        );

更新:

好的,因此您还应该通知所有应用程序外部观察者发生了修改。在 AngularJS 中,如果一个变量被控制器修改但在其他地方观察,并且如果没有 $digest 或 $apply 观察者看不到任何变化。所以问题不在于观察者的选择,而在于缺少 $apply 命令。

只需添加:

$scope.$apply();

在你的控制器中改变数组之后。

【讨论】:

  • Angular 为此提供了一个 $watchCollection ,所以我认为我不应该使用 deep watch 并且它也不起作用 - 它仅在参考更改时才会触发
  • selectedItems的内容是什么?是一个简单值或对象的数组吗?在第二种情况下,您需要深入观察它。无论如何,我使用了function(){ return controller.selectedItems; },因为通常给controller.selectedItems 不起作用。
  • 这是对象数组,但我不想知道单个对象的变化,而是数组的变化——删除/添加的项目。因此,例如,每当将新项目添加到此数组时,我都想触发事件。
  • 那么为什么不看数组的大小呢?
  • 我将它们存储在与它们的实际位置相对应的索引处,因为稍后我需要该位置,因此数组可能看起来像 [obj, , , , , obj],并且下一项可能会添加到第三个索引左右。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2014-04-25
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多