在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()
在同一摘要中不会发生?
答案 0 :(得分:0)
$ apply可以将更改与摘要周期集成
您可以将$ apply函数视为集成机制。您会看到,每次更改附加到$ scope对象的某个监视变量时,Angular都会知道更改已经发生。这是因为Angular已经知道要监控这些变化。因此,如果它发生在框架管理的代码中,摘要周期将继续。但是,有时您希望更改Angular世界之外的某些值,并看到更改正常传播。考虑一下 - 你有一个$ scope.myVar值,它将在jQuery的$ .ajax()处理程序中修改。这将在未来的某个时刻发生。 Angular不能等待这种情况发生,因为它没有被指示等待jQuery。要解决这个问题,已经引入了$ apply。它可以让您明确地开始消化循环。但是,您应该只使用它来将一些数据迁移到Angular(与其他框架集成),但是从不将此方法与常规Angular代码结合使用,因为Angular会抛出错误。
所有这些与DOM有何关系?
好吧,你应该再次按照教程,现在你知道了这一切。摘要周期将确保UI和JS代码保持同步,通过评估附加到所有$范围的每个观察者,只要没有任何变化。如果摘要循环中没有更多的更改,则认为它已完成。您可以在Controller中显式地将对象附加到$ scope对象,也可以直接在视图中以{{expression}}形式声明它们。
SRC:READ THIS