AngularJS服务返回数据,但在编辑时会编辑原始服务数据

AngularJS service returns data but when edited it edits the original service data?

本文关键字:数据 编辑 服务 原始 返回 AngularJS      更新时间:2023-09-26

我不小心写了一些有效的东西,但我觉得不应该..! 基本上我有一个以 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 的新手,可能有更好的方法来做到这一点,所以我的问题分为两部分 - 为什么代码要做它的样子,还有更好的方法吗?

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