Javascript 控制器参数在my directive link函数中未定义
我试图做一些非常简单的事情,使用link函数的controller参数作为我的指令,但是它被作为“未定义”传递。谁能告诉我我错过了什么 HTML:Javascript 控制器参数在my directive link函数中未定义,javascript,angularjs,Javascript,Angularjs,我试图做一些非常简单的事情,使用link函数的controller参数作为我的指令,但是它被作为“未定义”传递。谁能告诉我我错过了什么 HTML: <div ng-app="myApp"> <div ng-controller="SampleCtrl" my-form > <p> Click count: {{ count }} </p> </div
<div ng-app="myApp">
<div ng-controller="SampleCtrl" my-form >
<p> Click count: {{ count }} </p>
</div>
</div>
与其尝试关闭控制器,不如像我在本文中所做的那样使用作用域?我的指令似乎必须使用指令定义对象来返回链接函数,并包含对控制器的引用,作为ddo的“控制器”参数,如下所示:
myApp.directive('myForm', function() {
var linkFn = function(scope, elem, attrs, ctrl) {
ctrl.init("17"); //This now works, due to my return below
elem.bind('click', function() {
scope.$apply(function(){
scope.count++;
});
});
};
return {
controller: 'SampleCtrl',
link:linkFn};
});
正如丹在对公认答案的评论中正确地提问一样
究竟为什么指令必须有任何直接参考 到一个特定的控制器?难道他们不应该和蔼可亲吗 便携式的 您不需要引用控制器来利用指令中的
ctrl
参数
相反,您可以使用require:'ngModel'
由于模型将在ng控制器范围值内定义,因此无需硬编码控制器名称即可创建到控制器的链接
下面是一个基于指令的示例,我使用该指令在输入文件太大时将表单设置为无效
myApp.directive('maxFileSize', function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
var maxSize = Number(attrs.maxFileSize);
var sizeHandler = function () {
if (element.get(0).files.length) {
var fileSize = element.get(0).files[0].size; // in bytes
if (fileSize > maxSize) {
//console.log('file size is more than ' + maxSize + ' bytes!');
ctrl.$setValidity("fileSize", false);
} else {
ctrl.$setValidity("fileSize", true);
}
}
};
element.bind('change', sizeHandler);
}
};
});
我可以,那当然可以,但我正在尝试让控制器参数工作。实际上,我想做的比我在这里演示的要多,这只是我可以很快组合起来的最简单的例子。酷,我会再做一次。这是我所能想到的最简单的让实际代码工作的方法。有趣的是,这里没有提到:angular开发团队显然不使用这种模式(即使可能是必要的)。为什么指令必须直接引用特定的控制器?它们不是应该很好而且便于携带吗?
myApp.directive('maxFileSize', function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
var maxSize = Number(attrs.maxFileSize);
var sizeHandler = function () {
if (element.get(0).files.length) {
var fileSize = element.get(0).files[0].size; // in bytes
if (fileSize > maxSize) {
//console.log('file size is more than ' + maxSize + ' bytes!');
ctrl.$setValidity("fileSize", false);
} else {
ctrl.$setValidity("fileSize", true);
}
}
};
element.bind('change', sizeHandler);
}
};
});