Контроллер 'ngModel', требуемый директивой '...', не может быть найден

Что здесь происходит?

Вот мои директивы:

// template <input ng-model="theModel"  />
app.directive('bseInput', function () {
    return {
        templateUrl: "/Scripts/bse/bse-inputs.html",
        scope:
        {
            theModel: '=',
        },
        compile: function compile(tElement, tAttrs, transclude) {

            // do stuff

        }
    };
});


app.directive('submitRequired', function (objSvc) {
    return {
        require: 'ngModel',
        link: function (scope, elm, attrs, ctrl) {

          // do something
        }
    };
});

Вот пример используемой директивы:

<input bse-input submit-required="true" the-model="someModel"></input>

Вот текст фактической ошибки:

Ошибка: [$ compile: ctreq] Контроллер 'ngModel', требуемый директивой 'submitRequired', не может быть найден! http://errors.angularjs.org/1.2.2/ $compile/ctreq? p0 = ngModel & p1 = submitRequired   на http://www.domain.ca/Scripts/angular/angular.js:78:12  на getControllers (http://www.domain.ca/Scripts/angular/angular.js:5972:19)   at nodeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:6139:35)   на composLinkFn (http://www.domain.ca/Scripts/angular/angular.js:5550:15)   at nodeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:6132:24)   на composLinkFn (http://www.domain.ca/Scripts/angular/angular.js:5550:15)   at publicLinkFn (http://www.domain.ca/Scripts/angular/angular.js:5458:30)   на http://www.domain.ca/Scripts/angular/angular.js:1299:27  в Scope. $get.Scope. $eval (http://www.domain.ca/Scripts/angular/angular.js:11634:28)   в поле Scope. $get.Scope. $apply (http://www.domain.ca/Scripts/angular/angular.js:11734:23) angular.js: 9159 (анонимная функция) angular.js: 9159 $ get angular.js: 6751 nodeLinkFn angular.js: 6141 compositeLinkFn angular.js: 5550 nodeLinkFn angular.js: 6132 compositeLinkFn angular.js: 5550 publicLinkFn angular.js: 5458 (анонимная функция) angular.js: 1299 $ get.Scope. $eval angular.js: 11634 $ get.Scope. $apply angular.js: 11734 (анонимная функция) angular.js: 1297 invoke angular.js: 3633 doBootstrap angular.js: 1295 bootstrap angular.js: 1309 angularInit angular.js: 1258 (анонимная функция) angular.js: 20210 триггер angular.js: 2315 (анонимная функция) angular.js: 2579 forEach angular.js: 300 eventHandler angular.js: 2578ar.js: 7874

Ответ 1

На всякий случай, что приведенный выше фрагмент <input> не содержит опечатки, это проблема:

the-model

нам нужно ng-model

<input bse-input submit-required="true" ng-model="someModel.Property"></input>

angular использует нормированные/денормализованные соглашения об именах, которые в конце означают: ng-model - это способ html, как выразить ngModel. HTML нечувствителен к регистру... и это решает эту проблему

Предложение. Если мы работаем с несколькими директивами, применяемыми к одному элементу:

  • bse-input
  • Submit-требуется

Мы должны позволить обеим им работать со стандартными настройками INPUT. Таким образом, для обеих моделей может потребоваться ng-модель, как способ доступа к модели, переданной на вход.

если модель должна представлять разные настройки, что абсолютно нормально, нам просто не нужно пропускать также ng-модель

О require:

Когда у вас есть вложенные директивы, которые должны взаимодействовать друг с другом, способ сделайте это через контроллер.

Другие директивы могут передать этот контроллер им с требованием свойства синтаксис. Полная форма запроса выглядит следующим образом:

require: '^?directiveName'

Объяснения строки require:

  • directiveName: Это имя с верблюжьим именем указывает, с какой директивой должен поступать контроллер. Поэтому, если наши директива должна найти контроллер на своем родителе, wed напишите его как myMenu.
  • ^ По умолчанию Angular получает контроллер от именованной директивы на том же элементе. Добавление этого необязательного ^ указывает, что также нужно подойти к дереву DOM, чтобы найти директиву. Например, нужно добавить этот символ; конечная строка будет \^ myMenu.
  • ? Если требуемый контроллер не найден, Angular выдаст исключение, чтобы рассказать вам о проблеме. Добавление a? символ в строку говорит, что этот контроллер является необязательным и что исключение не должно быть выбрано, если не найденный. Хотя это звучит маловероятно, если мы хотим позволить использовать s без контейнер, мы могли бы добавить это для окончательной строки запроса? \^ myMenu.