使用Controller As更新回调中的属性

时间:2018-05-28 11:04:45

标签: javascript angularjs ecmascript-6 angularjs-controlleras

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

<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
    });
}

我已经尝试将项目设置为函数中的变量以及我可以尝试重新引用的各种其他内容,但是都没有成功。

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

1 个答案:

答案 0 :(得分:0)

正如您已经指出的那样,通过调用item =,您实际上只是重新分配对传递给updateItem的参数的引用 - 您实际上并未实际更新原始item 1}}对象。

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

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

}中的任何属性都删除