Angularjs нг-повтор не обновляется

В angularjs у меня есть раскрывающийся список kendo ui: в моем коде, когда я нажимаю на элементы в раскрывающемся списке, я удаляю выбранный элемент и добавляю его в HTML-таблицу (как элемент строки):

$scope.optionsDropDownListCatalogs = {
    dataTextField: "Name",
    dataValueField: "Id",
    select: onSelect
};

function onSelect(e) {  
   //Get the selected item
   var item = $scope.dropdownlistCatalogs.dataItem(e.item.index());

   //Remove it from the dropdownlist
   $scope.optionsDropDownListCatalogs.dataSource.remove(item);

   //Add the item in the table datasource
   $scope.products.push(item);
}

На html-странице у меня есть ng-repeat, чтобы показать объекты внутри $scope.product объект.

Иногда таблица обновляется, иногда нет. Если я поставлю $scope.$ Apply(); в конце функции таблица (кажется, обновляется) корректно.

Почему я должен выполнить $apply()? push() не происходит в том же дайджесте?

1 ответ

$apply позволяет интегрировать изменения с циклом дайджеста

Вы можете думать о функции $apply как о механизме интеграции. Видите ли, каждый раз, когда вы изменяете некоторую наблюдаемую переменную, присоединенную непосредственно к объекту $scope, Angular будет знать, что изменение произошло. Это потому, что Angular уже знал, чтобы отслеживать эти изменения. Поэтому, если это происходит в коде, управляемом фреймворком, цикл дайджеста будет продолжен. Однако иногда вы хотите изменить какое-то значение за пределами мира Angular и увидеть, как эти изменения распространяются нормально. Учтите это - у вас есть значение $scope.myVar, которое будет изменено в обработчике $.ajax() jQuery. Это произойдет в какой-то момент в будущем. Angular не может дождаться, когда это произойдет, так как ему не было приказано ждать на jQuery. Для решения этой проблемы был введен $apply. Это позволяет вам начать цикл пищеварения явно. Тем не менее, вы должны использовать это только для переноса некоторых данных в Angular (интеграция с другими платформами), но никогда не используйте этот метод в сочетании с обычным кодом Angular, так как тогда Angular выдаст ошибку.

Как все это связано с DOM?

Что ж, вы должны действительно следовать учебнику снова, теперь, когда вы все это знаете. Цикл дайджеста обеспечит синхронизацию пользовательского интерфейса и кода JS, оценивая каждый наблюдатель, присоединенный ко всем областям $, до тех пор, пока ничего не изменится. Если в цикле дайджеста больше не происходит изменений, то он считается завершенным. Вы можете прикрепить объекты к объекту $scope либо явно в Controller, либо объявив их в форме {{expression}} непосредственно в представлении.

SRC: ПРОЧИТАЙТЕ ЭТО

Другие вопросы по тегам