2014-02-16 3 views
14

Что здесь происходит?Контроллер '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> 

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

Ошибка: [$ компиляции: ctreq] Контроллер 'ngModel', требуемый директивой 'submitRequired', не может быть найден! http://errors.angularjs.org/1.2.2/ $ компилировать/ctreq? Р0 = ngModel & р1 = submitRequired в http://www.domain.ca/Scripts/angular/angular.js:78:12 на getControllers (http://www.domain.ca/Scripts/angular/angular.js:5972:19) на nodeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:6139:35) на compositeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:5550:15) на nodeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:6132:24) на compositeLinkFn (http://www.domain.ca/Scripts/angular/angular.js:5550:15) в 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 $ применяются (http://www.domain.ca/Scripts/angular/angular.js:11734:23) angular.js: 9159 (анонимная функция) angular.js: 9159 $ получить angular.js: 6751 nodeLinkFn angular.js: 6141 compositeLinkFn angular.js: 5550 nodeLinkFn angular.js: 6132 compositeLinkFn angular.js: 5550 publicLinkFn угловой. ЯШ: 5458 (анонимная функция) angular.js: 1299. $ get.Scope $ Eval angular.js: 11634 $ get.Scope $ применяются 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

ответ

21

Только в том случае, что выше <input> фрагмент кода не содержать опечатку, это вопрос:

the-model 

ng-model нам нужно

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

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

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

  • BSE-вход
  • Submit-требуется

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

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

О require:

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

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

require: '^?directiveName' 

пояснения требуют строк:

  • directiveName: Это верблюжьего обсаженного имя указует, какую ДИРЕКТИВА контроллера должны поступать из. Поэтому, если наша директива должна найти контроллер на своем родителе, мы будем писать его как myMenu.
  • ^ По умолчанию Угловой получает контроллер от именованной директивы на том же элементе. Добавление этого необязательного символа ^ говорит также о том, чтобы найти дерево DOM, чтобы найти директиву. Для примера нам понадобится , чтобы добавить этот символ; последней строкой будет \^myMenu.
  • ? Если требуемый контроллер не найден, функция «Угловая» выдаст исключение, чтобы рассказать вам о проблеме. Добавление a? символ в строку говорит, что этот контроллер является необязательным и что исключение не следует вызывать, если не найдено . Хотя это кажется маловероятным, если мы хотим использовать s без контейнера , мы могли бы добавить это для окончательной строки запроса? \^MyMenu.
+0

the-model и theModel были намеренно из-за необходимости передать ngModel в директиву с двусторонней привязкой данных. –

+5

, если вы используете требование, это означает: ** Другие директивы могут передавать этот контроллер **. поэтому требуемый атрибут связан с другой директивой, а не с моделью. Я имею в виду, если у вас будет параметр 'require: 'ngModel', тогда атрибут HTML должен быть contanin ng-model. Функция ссылки, затем в переменной 'ctrl' получит тот контроллер, который требуется только –

+0

Я не понимаю, что последний комментарий. «Require»: «ngModel» означает, что мы передаем контроллер ngModel? –

Смежные вопросы