AngularJS - 服务更改控制器数据

AngularJS - service changes controller data

我发现当我在我的控制器中调用一个服务方法并将一个对象作为参数传递给它时,对该对象所做的任何更改(在服务方法内部)也会从我的控制器对原始对象进行更改.

我一直认为控制器数据应该保持不变,直到我在 promise 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

我相信这是 angular 数据绑定的本质。如果您想传递 $scope 变量的详细信息,您可以使用 angular 的克隆功能和 copy 或通过在服务上创建副本来更新您的服务以略微不同地工作边。普通的 CRUD 样式应用程序,您通常会传递实体的 id、接收新实体或发布更改,这些更改在大多数情况下可能已经存在于客户端。