ngModel не передает данные обратно в родительскую область в директиве

Связанный пост, но не помог: Проблема области видимости при настройке ngModel из директива

РЕДАКТИРОВАТЬ: Могу ли я использовать ng-модель с изолированной областью? не работает либо.

У меня возникла проблема, но, думаю, более сложным образом. Я хочу написать раскрывающийся список, который не использует ввод для сохранения данных. Я бы предпочел, чтобы ngModel позаботился об этом.

http://jsfiddle.net/QeM6g/6/

В приведенном выше примере jsFiddle показана демонстрация, в которой вышеописанные методы не работали.

// this is what should work but doesn't
ngModel.$setViewValue(value);
scope.$apply(attr.ngModel,value);

По какой-то причине область ngModelController является родственной моей области. поэтому он не передает изменения обратно родителю. по крайней мере, все другие одноуровневые области ведут себя так, как вы ожидаете. то есть ng-change работает в комбинации.


person Richard Burkhardt    schedule 29.01.2013    source источник


Ответы (2)


Angularjs не очень хорошо справляется с прямыми привязками к примитивным типам.

Если вы измените эту строку:

$scope.productId = 16;

к чему-то вроде этого:

$scope.selectedProduct = {
    id: 16
}

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

jsFiddle: http://jsfiddle.net/M2cL7/

person bmleite    schedule 29.01.2013
comment
Спасибо, никогда бы не догадался. Спас меня от бессонных ночей. Я сообщил об этом как здесь для всех, кто хочет знать, будет ли такое поведение быть исправлено. - person Richard Burkhardt; 29.01.2013
comment
@bmleite Это не проблема с привязкой данных angular. Речь идет о прототипировании javascript. Пожалуйста, прочтите github.com/angular/angular.js/wiki/Understanding-Scopes< /а> - person Vivek; 24.11.2015

Не привязывайтесь к примитивам в области, привязывайтесь к объекту в области.

Из https://github.com/angular/angular.js/wiki/Understanding-Scopes

... пока вы не попробуете двустороннюю привязку данных (т. е. элементы формы, ng-модель) к примитиву (например, числу, строке, логическому значению), определенному в родительской области, изнутри дочерней области. Он не работает так, как большинство людей ожидает, что он должен работать. Что происходит, так это то, что дочерняя область получает свое собственное свойство, которое скрывает/затеняет родительское свойство с тем же именем. Это не то, что делает AngularJS — это то, как работает прототипное наследование JavaScript. Новые разработчики AngularJS часто не понимают, что ng-repeat, ng-switch, ng-view и ng-include создают новые дочерние области, поэтому проблема часто проявляется, когда задействованы эти директивы.

Эту проблему с примитивами можно легко избежать, если следовать "лучшей практике" всегда использовать символ ".". в ваших ng-моделях

so

<input ng-model="tweetText">

становится

<input ng-model="tweet.text">

Отличное резюме здесь:

https://www.youtube.com/watch?v=ZhfUv0spHCY&feature=youtu.be&t=30m

person Neil Ellis    schedule 31.05.2016
comment
СПАСИБО СПАСИБО СПАСИБО УУУУУУ!! - person Stefan Vasiljevic; 05.10.2016