AngularJS, как мне обновить GUI, когда Promise возвращается - PullRequest
0 голосов
/ 02 октября 2018

Мой вид привязан к коллекции объектов, которая отлично отрисовывается.Одним из свойств является async, которое при возврате не обновляет это значение в графическом интерфейсе.Чтобы приступить к асинхронной работе, я сопоставляю каждое свойство, которое должно быть отображено, сосредотачиваемся на свойстве async и делаю что-то вроде этого:

function getDetails(thing) {
    console.log("---->" + thing.id);
    thingService
        .getDetailsAsync(thing.id, true)
        .then(function Success(result) {
            thing.details = result.details;                                   
        }, function Error(reason) {
            thing.details = [];             
        });
}

Эта вещь является частью первой части привязки $scope.details, который использует GUI.

$scope.meeting.map(thing=>{
    getDatails(thing);
});

Асинхронные обновления не отображаются, но все остальные поля отображаются в GUI.Разве графический интерфейс не должен автоматически обновляться после выполнения каждого обещания?Нужно ли мне делать $ scope.Apply () [который тоже не сработал] или мне нужно «вырвать» каждую вещь из $ scope.meeting и сбросить на новый разрешенный объект обещания?

Я запутался, пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

карта возвращает новый массив.Используйте forEach, например

$scope.meeting.forEach(thing=>{
    getDatails(thing);
});

ИЛИ, если вы хотите использовать только карту

$scope.meeting = $scope.meeting.map(thing=>{
     getDatails(thing);
});
0 голосов
/ 03 октября 2018

Мой окончательный ответ был совершенно другим.Оказалось, что другой компонент уже выдавал нужные мне асинхронные запросы.Я просто положил туда излучатель и ждал, когда придут ответы ... (звучит как RXjs).

Но чтобы показать обновленные записи, мне пришлось найти запись в массиве, обновить ееи затем обновите запись массива.Примерно так:

var found = _.find(details, { id:id }
if(found){ found.notes = emittedData;}
found = found; <--This fired of the re-render with new data.

Будучи новичком в цикле дайджеста, я подумал, что достаточно просто установить свойство, чтобы обнаружить изменение и выполнить повторную визуализацию.

Прокомментируйте.

0 голосов
/ 02 октября 2018

Из того, что вы поделились, все, что я получаю, это то, что вы передаете "$ scope object" в функцию getDetails() в качестве аргумента, который в основном создает новый локальный объект "вещь" в функции getDetailsв JS и обновляет этот локальный объект, а не объект $ scope.

Итак, вам следует использовать [(your $scope object).details = result.details] вместо [thing.details = result.details].

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