【问题标题】:When i am changing the value of one variable another is also changing当我改变一个变量的值时,另一个变量也在改变
【发布时间】:2016-05-19 09:27:36
【问题描述】:

我通过使用以下方法从数据库中获取值并将输出数据插入到两个变量中,当我更改 $scope.contactRole 中的值时,'contactRoleForTrace' 的值也在发生变化,但我不想要改变它。所以你能告诉我我该怎么做吗?

var contactRoleForTrace = [];
$scope.getUserRoles = (function () {
    //Method to get data from database
    intakeAppFactory.getRoles(item)
        .success(function (data) {
            contactRoleForTrace = data;
            $scope.contactRole = data;
        }).error(function (data, status) {
            $scope.error = "An Error has occured!";
        });
});

【问题讨论】:

    标签: javascript arrays angularjs


    【解决方案1】:

    当前您将data 对象引用直接分配给contactRoleForTrace$scope.contactRole,因此$scope.contactRole/data 发生的任何更改都会自动更新contactRoleForTrace 变量,因为它们绑定到相同的引用(@ 987654327@对象)。

    您应该使用angular.copy,它将创建data 对象的克隆,因此contactRoleForTrace$scope.contactRole 将指向不同的引用。

    contactRoleForTrace = angular.copy(data);
    

    【讨论】:

    • 我同意你的回答,但也许值得一提的是,如果你在代码上使用 2 个具有相同数据的数组,可能(不确定)你应该重新考虑这个对象。注意:如果这样做的主要原因是跟踪差异,则可能还有其他方法可以跟踪旧值和新值。
    • @JoseRocha 好吧,我明白你的意思了.. 但我认为,OP 想要实现Revert Changes 的功能,他可能会提供选项以将级别更改回原始状态(在编辑表单之前) ) 通过单击相同的按钮.. 你的意思是说 OP 应该去观看以比较旧值和新值以获得差异?
    • 我希望你不要误会我的意思,你的答案就是问题的正确答案。我只是说它可以改进为“额外的英里”。 ng-watch 是跟踪变化的一个很好的例子(只要你不 ng-watch 每一件事)。另一件事是,如果操作想要完全还原(例如表单),则应再次加载可以编辑的数据,而不是使用先前加载的数据还原(根据我的经验,这可以防止将来出现一些问题)。
    • @JoseRocha 谢谢,我不太同意你所说的。根据我的经验,我个人更喜欢避免使用观察者,因为使用它是不好的做法。你的第二点就像你建议重新加载页面一样,我只是更喜欢在用户登陆页面时保留旧对象的副本,并且会当用户说“还原更改”时重新分配对象(与您的建议相比,这并没有太大的优势,但我觉得这很符合要求,而且我也在减少一个服务器往返)
    • 只是为了从我这边澄清,我不是在谈论重新加载整个页面,而是在页面上重新加载数据(或部分数据)。我反对在没有明确需要的情况下重新加载页面。
    猜你喜欢
    • 2021-03-21
    • 2023-03-08
    • 2011-08-31
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多