Подтвердить что ты не робот

Angular - ngModel не обновляется при вызове внутри ngInclude

Прежде всего, плункер: http://plnkr.co/edit/v1uTz5

Это рабочая демонстрация проблемы, с которой я сталкиваюсь.

У меня есть ng-include, чтобы включить частичный.

Внутри частичного текста есть текстовый ввод с директивой ngModel AND.

Модель обновляется соответственно внутри include, но любое взаимодействие за пределами include игнорируется. {{test}} вне include не обновляется, но внутри {{test}} делает.

Директива при вызове обрабатывает ключ enter и вызывает правильную область действия и функцию. Однако переменная $scope.test никогда не обновлялась, но $scope.testFinal обновляется, а шаблон ng-include отображает ее соответствующим образом. Попытка использовать reset модель $scope.test тоже не работает.

Я что-то упустил? Или это ошибка с директивой или с ng-include?

4b9b3361

Ответ 1

Вместо использования примитива для определения переменной сделайте его объектом.

$scope.model={test:''};

Директивы создают свою собственную область для каждого элемента. Когда вы приравниваете примитив к новой переменной области видимости, она не имеет привязки к оригиналу, однако, когда оригинал является объектом, создается ссылка, а не копия, а сделанные изменения будут отражены в другом

Простой пояснительный пример:

var a ='foo';
var b= a;
/* now change a*/
a='bar';
alert( b) // is still 'foo'

теперь делают то же самое с объектом:

var obj_1= {a:'foo'};
var obj_2=obj_1;
/* now change obj_1.a*/
obj_1.a='bar';
alert( obj_2.a) // change to obj_1 will also change obj_2 and alert returns "bar"*/

Изменен ваш плункер

Прочитайте эту статью в wiki angular для более подробного объяснения

Ответ 2

Джон Линдквист имеет видео об этом. Хотя он не совсем объясняет, почему вам нужно использовать объект.

В основном каждый раз, когда появляется новая неизолированная область видимости, каждое свойство родительской области копируется в новую область действия и, как объясняет @charlietfl, копирование примитивного типа действительно создает копию "но с объектами то, что вы получаете, является ссылкой, следовательно, изменения глобальны.

Ответ 3

ng-include создает свою собственную область действия и отличается от внешней области. Используйте this.test вместо $scope.test внутри шаблона ng-include. Он будет работать правильно.