2015-08-28 2 views
0

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

Я всегда думал, что данные контроллера должны оставаться неизменными до тех пор, пока я не изменил его внутри обещания win/error, и только если мне нужно.

JS образец:

// Code goes here 
var app = angular.module('App', []); 

app.controller('AppCtrl', function($scope, simpleService){ 
    $scope.data = { d: 1, c: 10}; 

    $scope.clickMe = function(){ 
    simpleService.clickMe($scope.data).then(function(res){ 
     alert($scope.data.d); 
    }) 
    .catch(function(err){ 
     alert($scope.data.d); 
    }); 

    } 

}); 

app.factory('simpleService', function($q){ 
    var simpleServiceMethods = {}; 

    simpleServiceMethods.clickMe = function(data){ 
    var deffered = $q.defer(); 
    //data = JSON.parse(JSON.stringify(data)); - solution: clone data without references 

    data.d = 1111; 

    deffered.reject(); 

    return deffered.promise; 
    } 

    return simpleServiceMethods; 
}); 

Plunker демо: http://plnkr.co/edit/nHz2T7D2mJ0zXWjZZKP3?p=preview

+0

Я не уверен, что понимаю эту проблему, знаете ли вы о привязке данных AngularJS? – Sphaso

+0

Проблема в том, что служба меняет данные моего контроллера. Это нормально? – tbutcaru

+0

Это если вы передаете переменную $ scope в службу и затем измените ее. Вот как работает привязка данных AngularJS – Sphaso

ответ

0

Я считаю, что это природа привязки данных угловых в. Если вы хотите передать данные переменной $scope, вы можете использовать функцию клонирования углов с помощью copy или обновить свои службы, чтобы работать несколько иначе, создав копию на стороне обслуживания. Обычные приложения типа CRUD, как правило, передают id объекта, получая новый объект или публикуя изменения, которые в большинстве случаев могут присутствовать на стороне клиента.

+0

, даже если я не передаю переменную '' $ scope'', у меня такое же поведение. это относится и к обычным объектам? – tbutcaru

+0

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

+0

получил. это первый раз, когда я столкнулся с этой ситуацией за 9 месяцев работы с Angular, и именно поэтому я запутался. Как вы сказали, до сих пор я пропускал только «id» сущности, но на этот раз мне пришлось передать все это. – tbutcaru

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