【问题标题】:AngularJS: require with bindToController, required controller is not available?AngularJS:需要使用 bindToController,所需的控制器不可用?
【发布时间】:2016-05-16 00:38:13
【问题描述】:

我有一个指令,定义中的用户需要和 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>

【问题讨论】:

    标签: angularjs


    【解决方案1】:

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

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

    而不是:

    controller: 'FormValidationManagerCtrl as fvmCtrl',
    

    【讨论】:

    • 不,这不是问题所在。 vm 只是一个引用控制器中“this”的变量。我在视图中有正确的名称。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 2013-03-15
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多