Angularjs ng-repeat没有刷新

时间:2015-04-09 12:30:16

标签: jquery angularjs kendo-ui angular-kendo

在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 个答案:

答案 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

相关问题