2016-03-23 2 views
0

У меня есть следующий код:Почему требуется ng-требуемое значение ng-модели?

<input id="bestCost" name="bestCost" ng-model="vm.active.bestCost" ng-required="vm.active.funded == true" /> 

У меня есть метод в мой контроллер, который устанавливает vm.active = null. Это значение остается равным нулю, пока я не закрою асинхронный запрос. После того, как запрос уволен, Angular запускает дайджест. В результате к тому моменту, когда выполняется обработчик успеха асинхронного обещания, vm.active больше не является нулевым. Это объект с bestCost в нуль:

Object {bestCost: null} 

Ни один из моих других привязок шаблона не сделать это, только это поле. Единственное отличие между другими полями формы и этим заключается в том, что у него есть директива ng-required.

Есть ли способ предотвратить это? Я понимаю, что Angular будет изящно создавать иерархию объектов для полей форм/привязок, когда пользователь вводит их, но я действительно не хочу, чтобы директива ng-required сделала это.

+0

'vm', как правило, что вы используете внутри контроллер. Является ли ваш 'controllerAs' определенным как' vm'? – Makoto

+0

Да, внутри контроллера У меня есть 'var vm = this;' У меня также есть 'controllerAs' для' vm' – spoof3r

+1

@Makoto Angular в какой-то момент используется 'controllerAs vm' на своих страницах документации так, что' vm' будет используется в представлении, поскольку OP делает ... –

ответ

0

Думаю, я понимаю, о чем вы просите.

Вы можете использовать тот факт, что && не будет оценивать все термины, если предыдущие являются ложными, а в JavaScript (на которых выражены выражения AngularJS) используются истинные-y и false-y вместо строгих булевых значений.

ng-required="vm && vm.active && vm.active.funded == true" 

Также вы можете использовать ng-if сделать input элемент не отображаться в DOM (и ng-required выражение даже не будет оцениваться), обернув элемент в теге с ng-if - если это приходится сделать запрос асинхронного перед элементом может использоваться это не может быть плохо (если пользователь взаимодействует с input элементом, прежде чем запрос асинхронного заканчивает то ng-model будет создать vm.active):

<div ng-if="vm.active"> 
    <input id="bestCost" name="bestCost" ng-model="vm.active.bestCost" ng-required="vm.active.funded == true" /> 
</div> 
+0

Я действительно надеялся, что это сработает, но, к сожалению, этого не произошло. Хотя я действительно сомневаюсь, почему это не так, потому что вы совершенно правы с тем, как JS будет замыкать следующие предикатные предложения – spoof3r

+0

@ spoof3r Можете ли вы сделать Plunker, демонстрирующий проблему? Также см. Мой второй вариант о 'ng-if'. –

+0

Я также могу предположить, что вы установили в свой контроллер 'vm.active.funded' значение по умолчанию, такое как' null' или 'false', то же самое для' bestCost' . Ваш 'ng-required' будет по-прежнему работать как ожидалось Но вам понадобится ваш if, чтобы перейти на «ng-if = vm.active.funded! = Null», например – AlexStef

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