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: ПРОЧИТАЙТЕ ЭТО