2015-03-28 2 views
3

MarkupПочему нг-модель требуется для нг-опции директивы

<div ng-app> 
    <div ng-controller="myCtrl"> 
    <select ng-options="i for i in [1,2,3]"></select> 
    </div> 
</div> 

С этой разметкой options не заполняется в select. Когда я предоставляю ng-model вместе с ng-options, он работает так, как ожидалось.

Для заполнения ng-model необходимо ввести следующие параметры: ng-options.

ответ

1

ngOptions нуждается в модели, чтобы определить, какая опция должна быть выбрана по умолчанию или какая модель для записи выбранного объекта/значения при изменении выбора.

Если не было никакой директивы ngModel, было бы трудно получить доступ к выбранному значению, и это потенциально может привести к неправильной практике, когда люди либо запрашивают DOM, чтобы определить значение, либо написать свои собственные директивы для этой цели. В обоих случаях это не идеально, так как этот тип вещей является ключевой идеей директив элементов угловой формы.

Также не стоит забывать, что ngOptions в сочетании с ngModel позволяют разработчику связывать целые объекты, как «значение» избранных элементов, что было бы сложно без ngModel.

Наконец, если по какой-либо причине не требуется иметь какую-либо модель при выборе (хотя это мало смысла), можно отобразить опции с помощью ngRepeat.

+0

Благодарим вас за подробное объяснение о 'ng-options'. Я понимаю использование и преимущества 'ng-options'. 'options' с' ng-repeat' не будет вводить никаких ограничений в отношении 'ng-model'. Зачем применять это ограничение с помощью 'ng-options'. Почему он не может просто оценить выражение и заполнить параметры? –

+2

Я думаю, что это дизайнерское решение. Просто не имеет смысла дублировать проблемы. 'ngRepeat' уже может отображать параметры, если вы хотите. Однако 'ngOptions' следует использовать для более гибкой и эффективной работы с моделью. Было бы очень легко позволить 'ngOptions' работать без' ngModel', но для этого потребуется несколько уродливых условий 'if' в коде. Почему, если вы уже можете использовать 'ngRepeat'. – dfsq

+0

Это интересная мысль. Они могли бы создать пустой объект и установить ngModelCtrl в ссылку, если? NgModel вернул null вместо выхода.В документации действительно говорится, что преимущество ngOptions меньше созданных областей. – DTing

1

Если нет модели, связанной с выбором, после выбора опции, в которой будет выведен выбор?

Что касается причины, почему параметры не отображаются вы можете увидеть исходный код:

https://github.com/angular/angular.js/blob/master/src/ng/directive/ngOptions.js#L355

return { 
    restrict: 'A', 
    terminal: true, 
    require: ['select', '?ngModel'], 
    link: function(scope, selectElement, attr, ctrls) { 

     // if ngModel is not defined, we don't need to do anything 
     var ngModelCtrl = ctrls[1]; 
     if (!ngModelCtrl) return; 

Функция ссылка короткие порезы, и все функции рендеринга не создаются.

+0

Как раз для случая сценария, я не хочу обновлять модель, я хочу опубликовать данные, используя форму submit. Я прочитал исходный код и разместил этот вопрос. Что может быть причиной для добавления такого условия? –

+0

Обратите внимание, что это бета-код (1.4). В настоящее время функциональность 'ngOptions' включена в директиву' select'. – zeroflagL

0

Из документов:

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

Сама точка ngOptions является предоставление значения для модели, а не просто визуализировать элементы option. Поэтому нет смысла использовать без ngModel.

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