Обновление свойства в обратном вызове с помощью Controller As - PullRequest
0 голосов
/ 28 мая 2018

Я работаю над проектом AngularJS, использующим ES6 и Controller As синтаксис, и сталкиваюсь с некоторыми новыми проблемами.У меня есть 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
    });
}

Я попытался установить элемент впеременная внутри функции и различные другие вещи, которые я мог бы попытаться повторно сослаться, но безуспешно.

Единственный успех, который у меня был, - это передача индекса, а затем ссылка на исходный объект путем установки let t = this; перед обещанием и затем t.thing.items[index] = response.data.Это работает, но кажется немного уродливым по сравнению с тем, что обычно можно ссылаться на объекты более напрямую.Что мне здесь не хватает?

1 Ответ

0 голосов
/ 28 мая 2018

Как вы указали, вызывая item =, вы фактически просто переназначаете ссылку на параметр, передаваемый в updateItem - вы фактически не обновляете исходный объект item.

Чтобы обойти это, вы можете обновить свойства 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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...