【问题标题】:Updating Property in callback with Controller As使用 Controller As 更新回调中的属性
【发布时间】:2023-03-23 18:10:01
【问题描述】:

我正在开发一个使用 ES6 和 Controller As 语法的 AngularJS 项目,但遇到了一些新问题。我有一个ng-repeat,它调用一个函数来更新一些数据。我希望在承诺返回时更新传递给ng-repeat 中的函数的项目。问题是承诺回来后我似乎无法再次引用它。

<div ng-repeat="item in ctrl.thing.items">
  <div ng-click="updateItem(item)">Update Item</div>
</div>

那么这里的更新函数:

updateItem(item) {
    let i = new this.Item(item);
    i.update().then(function(response) {
        item = response.data; // Item does not get updated in controller
    });
}

我尝试将 item 设置为函数中的变量以及我可以尝试重新引用的各种其他内容,但均未成功。

我唯一的成功是传递索引,然后通过在promise 之前设置let t = this; 然后t.thing.items[index] = response.data 来引用原始对象。这可行,但与通常能够更直接地引用对象相比,感觉有点难看。我在这里错过了什么?

【问题讨论】:

  • 请尝试,angular.merge(item, response.data);
  • 或 angular.extend(item, response.data) 取决于您的需要

标签: javascript angularjs ecmascript-6 angularjs-controlleras


【解决方案1】:

正如您所指出的,通过调用 item =,您实际上只是重新分配对传递给 updateItem 的参数的引用 - 您实际上并没有更新原始的 item 对象。

要解决这个问题,您可以使用Object.assign 使用来自response.data 的所有数据更新item 的属性:

updateItem(item) {
    let i = new this.Item(item);
    i.update().then(function(response) {
        Object.assign(item, response.data); // Copy the enumerable properties from response.data into item
    });
}

但是请注意,这不会删除以前在item 中但不再在response.data 中的任何属性;

【讨论】:

  • 我可以重新分配参考并在整个过程中进行更新吗?我刚刚尝试了 Object.assign ,然后它确实使用其他更改更新了视图,而重新分配则没有。我觉得以前我已经重新分配了传入的对象,它已经按照我的预期工作了,虽然我已经有一段时间没睡了,所以我可能没有想清楚。
  • 自从我自己使用 Angular 以来已经有一段时间了,所以也可能没有清楚地思考,但我很确定这是唯一的方法,除非你将变量绑定到服务,或直接到控制器上,例如$scope.item = 可能有效,但您也需要将范围传递给 updateItem
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多