2013-10-12 2 views
0

У меня есть вопрос о поведении AngularJS (поведение JS в целом)угловая JS Услуги/Фабрика атрибутов поведение

У меня есть Угловое завод, впрыскиваемого в контроллер.

Вот фрагмент кода контроллера

$scope.localObjCollection= myObjFactorySvc.getObjCollection(); 

Давайте предположим, что myObjFactorySvc.getObjCollection() возвращает следующий объект

[{"id":1"name":null,"address":null,"email":null}, 
{"id":2"name":null,"address":null,"email":null}, 
{"id":3"name":null,"address":null,"email":null}, 
{"id":4"name":null,"address":null,"email":null}, 
] 

Итак, я в значительной степени с помощью фабрики, чтобы получить сбор и хранение в $scope.localObjCollection. Мой вопрос: $scope.localObjCollection имеют значение (копию) данных, возвращаемых getObjCollection() или просто ссылку.

Так что если где-то внизу в исходном коде контроллера, если я делаю $scope.localObjCollection.push(newObj), он также обновляет оригинальную коллекцию на фабрике? Я должен угадать, но я хотел бы понять правильное поведение.

+0

AFAIK, если он является объектом, она должна быть ссылка, но если это значение, это копия. Таким образом, он должен обновить исходную коллекцию. Вы можете использовать 'angular.copy' для создания клона коллекции. – jpmorin

+1

Вот небольшая демонстрация, показывающая вам отличия: http://plnkr.co/edit/ZUA3zFcMCHj5SNDDZlwT?p=preview – jpmorin

+0

Поскольку фабрики являются одноточечными, вы можете делиться своими данными легко через свое приложение. – jpmorin

ответ

2

Массив в JavaScript - это объект, а объекты в JS всегда передаются/назначаются по ссылке. Поэтому ваш код будет также обновить оригинальную коллекцию на заводе, при условии, что ваш myObjFactorySvc.getObjCollection() что-то вроде этого:

myObjFactorySvc.getObjCollection = function() { return someArrayVariable; } 
Смежные вопросы