0

我有一个很大的来自,我试图在按钮中重置它,但它没有按预期工作。

请参阅下面的代码

function someCtrl() {
    var temp;
    var vm = this;
    someService.then(function (res) {
        vm.data = res;
        temp = res;
    });

    vm.reset = function () {
        vm.data = temp; //so that vm will reset to res;
    }
}

在这里,我在 ng-model 中使用 vm.data 来编辑每个字段。但是当 ng-model 编辑 vm.data 时,temp 也会自行更新。我猜正在发生一些可变范围参考。因此,当调用 vm.reset 时,vm.data 和 temp 相同,因此不会发生重置。

请建议一种方法来删除这个可变范围参考。

4

2 回答 2

1

使用angular.copy而不是分配,=表示引用,而angular.copy()创建一个新对象作为深层副本。

angular.copy(res, temp );

你的代码将是,

 someService.then(function (res) {
        vm.data = res;
        angular.copy(res, temp );
 });
于 2016-12-30T09:45:50.057 回答
1

在 javascript 中,对象是通过引用传递的。因此,在您的服务回调中,您将相同的响应对象分配给 vm.data 和 temp。这样,在更改 vm.data 的同时,您也在更改 temp,因为两者都指向相同的内存位置。

要使其工作,请将单独的实例(深度克隆 res 对象)分配给 vm.data 和 temp。像这样:

someService.then(function (res) {
    vm.data = angular.copy(res);
    temp = res; // no need to deep clone this one. temp can point to the res obj
});

并将重置功能更改为此

vm.reset = function () {
    vm.data = angular.copy(temp); // assign "backup" value to vm.data
}
于 2016-12-30T09:46:15.763 回答