1

Каков правильный способ проверки действительности ngModelController?AngularJS ngModelController

У меня есть действительный объект контроллера внутри директивы. Если я вхожу объект в консоль внутри директивы я получаю:

console.log(ctrl)

$dirty: false 
$invalid: true 
$modelValue: "" 
$name: undefined 
$pristine: true 
$valid: false 
$viewValue: "" 
... 

тогда, если я прошу if(ctrl.$valid === true) войти объект на консоль снова, он делает с точно таким же выводом.

console.log(ctrl); //ctrl.$valid is false 
if(ctrl.$valid == true) { 
    console.log(ctrl); //ctrl.$valid is false 
} 

дополнительно, если я осмотреть элемент можно увидеть соответствующий ng-invalid класс применяется.

Я буду попробуй, чтобы сделать демонстрацию, но я не могу себе представить, что смогу дублировать это.

Обновление Если I console.log(ctrl.$valid) - это отпечатки true. Итак, теперь я понимаю, как это проходит условное, но не почему объектная форма показывает $valid: false.

Также я сделал plnkr, который показывает пример того, что я делаю, но это не есть эта проблема. example

+0

Если цикл вычисления AngularJS не завершен, когда вы смотрите на значение $ valid, и у вас есть поведение, которое будет зависеть от него, вы можете захотеть добавить либо эту логику в обратный вызов для 'ngModelController' ' s массива '$ viewChangeListeners' или использовать' scope. $ watch (...) ', чтобы попробовать и наблюдать изменения. – rtcherry

+0

Взгляните на этот плункер: http: // plnkr.co/edit/46zIjWBMmmoiZIEytY7w – rtcherry

ответ

4

Вы пробовали это:

console.log(JSON.stringify(ctrl)); 
if(ctrl.$valid == true) { 
    console.log(JSON.stringify(ctrl)); 
} 

или

console.log("$valid is ", ctrl.$valid); 
if(ctrl.$valid == true) { 
    console.log("$valid should be true and is actually ", ctrl.$valid); 
} 

Это может быть связанно с this (старой) Chrome ошибки. Я считаю, что ожидаемое поведение заключается в том, что когда вы расширяете объект в консоли, вы получаете значение объекта во время расширения, а не во время журнала, поэтому вам нужно будет распечатать объект в виде строки или клонировать его при регистрации.

Редактировать - Некоторые подробности ...

Если запустить этот var obj = {a: 1, b: {}}; console.log(obj); obj['a'] = 2; console.log(obj); в консоли Chrome вы видите это существо вывод:

> Object {a: 1, b: Object} 
    a: 2 
    b: Object 
    __proto__: Object 

> Object {a: 2, b: Object} 
    a: 2 
    b: Object 
    __proto__: Object 

Edit 2

Будем надеяться это ответит на ваш вопрос. Похоже, что вы можете добавить парсер в массив $parsersпосле того, как был вызван$setViewValue(...). В результате, когда ваша директива сначала инициализируется, никакие подтверждения, которые вы добавили, не будут выполнены. Вы можете вручную выполнить их, вызвав что-то вроде ctrl.$setViewValue(ctrl.$viewValue); после того, как ваш парсер был добавлен.

+2

Чтобы следовать этому ответу, я полагаю, что причина, по которой она отображается как ложная в форме объекта при ее расширении в консоли, связана с тем, что какой-то другой код запускается после 'console.log()' который возвращает его к действию. – GregL

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