Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 控制器参数在my directive link函数中未定义_Javascript_Angularjs - Fatal编程技术网

Javascript 控制器参数在my directive link函数中未定义

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

我试图做一些非常简单的事情,使用link函数的controller参数作为我的指令,但是它被作为“未定义”传递。谁能告诉我我错过了什么

HTML:

    <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);
        }
    };
});