【问题标题】:AngularJS service returns data but when edited it edits the original service data?AngularJS 服务返回数据,但在编辑时它会编辑原始服务数据?
【发布时间】:2015-08-27 03:46:52
【问题描述】:

我有点不小心写了一些有用的东西,但我觉得不应该......!基本上我有一个以 JSON 格式返回的项目列表,用户可以选择其中一个,对其进行编辑并保存更改。这是我的代码的简化版本:

app.service("ItemData", ["$http", function ItemDataService($http) {
this.items = [];
var _this = this;

this.fetch = function() {
    var promise = $http.get("items.json");
    promise.then(
        function(payload) {
            _this.items = payload.data;
            console.log(_this.items); 
        }
    );
    return promise;
};

this.getFirstItem = function() {
    return this.items[0];
}

this.update = function() {
    console.log(this.items)
};
}]);


app.controller("PageCtrl", ["$rootScope", "ItemData", function($rootScope, ItemData) {

    var _this = this;
    $rootScope.item = null;

    var promise = ItemData.fetch();
    promise.then(
        function(payload) {
            setTimeout(function() {
                $rootScope.item = ItemData.getFirstItem();
                $rootScope.item.name = "why does this change the original service?";
                ItemData.update();
            }, 5000);
        }
    );
}]);

当调用ItemData.update 时,记录的项目会显示我所做的更改。但我希望$rootScope.item 是一个副本,而不是对原件的引用。这不是函数返回值的标准吗?为什么它还要在这里编辑我的原件?

我是 AngularJS 的新手,可能有更好的方法来做到这一点,所以我的问题是两部分 - 为什么代码会这样做,还有更好的方法吗?

【问题讨论】:

    标签: javascript angularjs variables scope


    【解决方案1】:

    这是基本的 JS。它返回对对象的引用,因此当您更改它时,它也会更新“根”。您可以在退回之前使用angular.copy()制作新版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2021-12-23
      相关资源
      最近更新 更多