Я пытаюсь написать что-то с помощью Angular Bootstrap Modal. Это вводит div в конец тела html, который не заключен в контроллер. В результате я не смог получить доступ к привязкам через $ scope, но по какой-то причине я могу записать их в представление из модели.

The code can be found here.

Ссылка на код на plnkr

В строке 23 вы обнаружите, что $ scope успешно записан, и данные привязаны к входу. Однако, если вы затем отредактируете ввод, через 3 секунды привязанная к нему $ scope будет предупреждена, но изменения в представлении не будут отражены. Я обнаружил, что эту проблему можно решить, заключив модальное окно в отдельный контроллер, но тогда я не могу заставить работать то, что хочу.

Возможен ли доступ к измененной модели с контроллера?

0
Kohjah Breese 27 Авг 2014 в 16:16

2 ответа

Лучший ответ

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

Код необходимо изменить на:

$scope.data = {};
$scope.data.yn = 'this';
alert( $scope.data.yn );
setTimeout( function(){alert( $scope.data.yn )}, 3000 );

И вход в:

<input type="text" name="yourName" value="David" data-ng-model="data.yn" />

Из:

$scope = {};
$scope.yn = 'this';
alert( $scope.yn );
setTimeout( function(){alert( $scope.yn )}, 3000 );

Ввод:

<input type="text" name="yourName" value="David" data-ng-model="yn" />
0
Kohjah Breese 27 Авг 2014 в 16:29
1
В моделях всегда должны быть точки. Причина была подробно описана много раз людьми, которые могли бы описать ее намного лучше меня. Вот один из примеров: nathanleclaire.com/blog/ 2014/04/19/…
 – 
James Kleeh
27 Авг 2014 в 16:34

См. страницу wiki на angular с лучшими практиками области применения.

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

Этой проблемы с примитивами можно легко избежать, следуя «лучшей практике» - всегда иметь '.' в ваших нг-моделях - смотрите стоит 3 минуты. Misko демонстрирует примитивную проблему привязки с помощью ng-switch.

1
Community 20 Июн 2020 в 12:12
Спасибо, стало немного легче укладываться в голове.
 – 
Kohjah Breese
27 Авг 2014 в 16:42
Здорово, что у вас все заработало, и это имеет смысл, не могли бы вы отметить любой из ответов как правильный? Придирчив к вопросам без ответов ;)
 – 
acg
28 Авг 2014 в 16:15
Я бы хотел, но я не могу выбрать свой ответ еще 41 минуту.
 – 
Kohjah Breese
29 Авг 2014 в 15:35