Контроллер '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.