AngularJS:require with bindToController,所需的控制器不可用?

时间:2016-02-05 21:58:38

标签: angularjs

我有一个指令,用户需要和定义中的bindToController。

(function(){
    'use strict';

    angular.module('core')
        .directive('formValidationManager', formValidationManager);

    function formValidationManager() {
        return {
            require: {
                formCtrl: 'form'
            },
            restrict: 'A',
            controller: 'FormValidationManagerCtrl as fvmCtrl',
            priority: -1,
            bindToController: true
        };
    }
}());

根据角度文档:

  

如果require属性是一个对象而bindToController是真的,   然后使用所需的控制器绑定到控制器   require属性的键。这种绑定发生在所有之后   控制器已经构建,但在调用$ onInit之前。看到   $ compileProvider助手,以获取如何使用它的示例。

所以我希望在我的控制器中:

(function () {
    'use strict';

    angular
        .module('core')
        .controller('FormValidationManagerCtrl', FormValidationManagerCtrl);

    FormValidationManagerCtrl.$inject = ['$timeout', '$scope'];

    function FormValidationManagerCtrl($timeout, $scope) {
        var vm = this;

        vm.API = {
            validate: validate
        };

        //vm.$onInit = activate;

        function activate() {
        }

        function validate() {
            $scope.$broadcast('fvm.validating');
            var firstInvalidField = true;
            Object.keys(vm.formCtrl).forEach(function (key) {
                var prop = vm.formCtrl[key];
                if (prop && prop.hasOwnProperty('$setTouched') && prop.$invalid) {
                    prop.$setTouched();

                    if (firstInvalidField) {
                        $timeout(function(){
                            var el = $('[name="' + prop.$name + '"]')[0];
                            el.scrollIntoView();
                        }, 0);
                        firstInvalidField = false;
                    }
                }
            });
            return firstInvalidField;
        }
    }
})();

vm.formCtrl将使用表单控制器填充。但是,它是未定义的。为什么不定义?另外,我试图在$ onInit函数中访问它,但$ onInit函数从未被调用过。我做错了什么?

我正在使用这样的指令:

<form novalidate name="editUserForm" form-validation-manager>

2 个答案:

答案 0 :(得分:1)

我不确定这是否是您的问题,但我认为您的指令声明应如下所示:

controller: 'FormValidationManagerCtrl',
controllerAs: 'vm',

而不是:

controller: 'FormValidationManagerCtrl as fvmCtrl',

答案 1 :(得分:0)

看起来这与角度版本有关。我在1.4.6,不支持这个。我已升级到1.5.0,其中OP中的代码运行良好。