我需要访问输入元素的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?
答案 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
,那么您已经完成了!即你可以:
directive
"ngModel"
,因为每个人都已完成ctrl
函数link
参数*
醇>
如果require是一个数组,则*或相应的元素,因此ctrl是一个数组
data()
对象上无需设置,因此没有理由从<{1}}对象 获取你可以只应用另一个指令。实际上,data()
是为支持“指令通信指令”所描述的模式之一:
requires
其他一些目的仍然可以在app.directive("purpose1", [ function () {
return {
require: "ngModel",
link: function (scope, element, attrs, ngModelCtrl) {
:
ngModelCtrl
我自己想要完全避免使用该指令,所以我希望有一种甚至更多直接的方式来访问ngModelController。