【问题标题】:Find other element with same directive within same scope?在同一范围内找到具有相同指令的其他元素?
【发布时间】:2015-01-13 12:59:37
【问题描述】:

有没有办法找到在同一范围内应用相同指令的其他元素?

我想用这个信息来创建matching input values 指令。

例如我可能有一个带有一些输入的模板,它们都使用相同的指令:

<div ng-controller="MainCtrl">
    <input type="text" same-value>
    <input type="text" same-value>
</div>

主要我会用它来比较密码和密码重复,但我想让这个指令更通用。

【问题讨论】:

  • 您可能应该将父指令与控制器一起使用。请提供有关您需要的更多具体信息。
  • @IlanFrumer - 请查看我的编辑

标签: angularjs angularjs-directive


【解决方案1】:

您可以创建一个父指令并通过控制器在子级和父级之间进行通信,或者您可以创建一个跨实例共享的服务。

另一种选择是在声明指令时提供共享数据和功能,如下所示:

angular.module("whatever").directive("sameValue", function() {

    var sameValueInstances = [];    

    return {
        link: function(scope, elem, attr) {
            sameValueInstances.push(scope);

            // register listener to remove from array when destroyed..


            // do something with the instance array
            sameValueInstances.forEach(...);
        }
    };

});

指令的实例不止一个,但指令声明的实例(函数本身)只有一个。声明是共享的,因此sameValueInstances 是共享的。当 Angular 实例化一个指令时,它会创建一个新的作用域并调用链接函数。每个实例都有自己的范围,这就是我们将范围放在实例上的原因。然后,我们使用添加到作用域的任何数据来识别实例,并可以使用作用域上的函数进行通信。

【讨论】:

  • 以上会起作用,因为会有一个指令实例吗?孤立的作用域呢?
  • @Iladarsda,它会起作用,确切的机制可能很难理解。我添加了一个解释。
  • 这确实有道理。最后一个不太可能的情况,它如何将自己限制为单个$controller scope。例如当一个页面上有多个控制器时?
  • @Iladarsda,对不起,我不明白第二个问题。
  • 如果我们在多个视图上使用 this 指令,我们可能会同时显示两个控制器/视图(例如使用 ui-router)。在这种情况下,我们的directive.sameValueInstances 将从所有控制器/视图中收集指令上的所有实例。这是一个非常边缘的场景,只是想知道你对此的看法。
猜你喜欢
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2017-01-17
  • 2015-04-13
相关资源
最近更新 更多