获取输入的ngModelController

时间:2014-10-10 12:41:44

标签: angularjs angularjs-directive

我需要访问输入元素的ngModelController来检查它是脏的还是原始的。

我设法用指令抓取,该指令抓取与元素关联的数据对象的输入的ngModel,使其可以从任何地方获取:

app.directive("input", [ function () {
    return {
        restrict: "E",
        replace: false,
        scope: false,
        require: "ngModel",
        link: function (scope, element, attrs, ctrls) {
            element.data('ngModelController', ctrls);
        }
    }
}])

我知道可以将其修改为将指令作为属性,使其更少地与“输入”相关联。标签

我在表示UI元素的指令中使用保存的控制器,并在其标记中包含input个元素。我不使用表单,因为这些元素应该在任何dom上下文中工作,并且表单意味着对层次结构的某些限制。所以我使用ngModelController来检查验证字段所需的一些东西。

但是有没有更好的方法来获取某些输入的ngModelController?

2 个答案:

答案 0 :(得分:5)

根据我的经验,Angular已经为您提供了这个。在您要访问ngModelController的指令中,执行以下操作:

app.directive("randomDirective", function() {
  return {
    ...
    require: "ngModel",
    link: function(scope, element, attrs, ctrl) {
      var someInput = element.find('theInput'),
          ngModelCtrlForInput = someInput.data().$ngModelController;
      //Now you can access the ngModel controller for the <input> of the directive
    }
  }
});

这是否是实现这一壮举的最佳方式还有待观察。我还没有看到更好的答案,但是(但是如果你知道一个,请告诉我,让我知道!)。

修改

This answer还有其他一些选项,包括类似的内容:

element.find('theInput').controller('ngModel')

答案 1 :(得分:0)

显然,仅仅使用角度已经为你提供的ngModelController **(当你require时),这是不够的。如the documentation

中所述
  

要掌握控制器,您require中的directive为。{   如下例所示。

事实上,OP 在这一点上得票最高的答案,都已经这样做了!。但他们做得更多;他们要么设置,要么获取,使用依赖于使用angular's jqLite附加到DOM元素的data的各种技术,这些技术都遵循{{ 3}},它遵循jQuery

如果要访问角度框架的外部,可能需要这些;即jQuery扩展可以到达控制器。毕竟,OP确实有一个“让它可以从任何地方获得”的目标。但是如果你设法专门使用angular,那么就不需要使用数据属性了。

但是,我认为值得一提的是:如果您想为特定目的访问ngModelController,那么您已经完成了!即你可以:

  1. 为此目的制作directive
  2. 需要"ngModel",因为每个人都已完成
  3. 操纵传递给ctrl函数
  4. link参数* 如果require是一个数组,则

    *或相应的元素,因此ctrl是一个数组

    data()对象上无需设置,因此没有理由从<{1}}对象 获取你可以只应用另一个指令。实际上,data()是为支持“指令通信指令”所描述的模式之一:

    requires

    其他一些目的仍然可以在app.directive("purpose1", [ function () { return { require: "ngModel", link: function (scope, element, attrs, ngModelCtrl) {

    ngModelCtrl

    我自己想要完全避免使用该指令,所以我希望有一种甚至更多直接的方式来访问ngModelController。