0

在 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()不会发生在同一个摘要中?

4

1 回答 1

0

$apply 可以将更改与摘要循环集成

您可以将 $apply 函数视为一种集成机制。您会看到,每次您直接更改附加到 $scope 对象的某个监视变量时,Angular 都会知道更改已经发生。这是因为 Angular 已经知道要监控这些更改。因此,如果它发生在框架管理的代码中,摘要循环将继续进行。但是,有时您想更改 Angular 世界之外的某些值并查看更改正常传播。考虑一下 - 你有一个 $scope.myVar 值,它将在 jQuery 的 $.ajax() 处理程序中进行修改。这将在未来的某个时候发生。Angular 不能等待这种情况发生,因为它没有被指示等待 jQuery。为了解决这个问题,引入了 $apply。它使您可以明确地开始消化周期。然而,

这一切与 DOM 有什么关系?

好吧,既然您已经了解了这一切,那么您真的应该再次按照本教程进行操作。摘要循环将确保 UI 和 JS 代码保持同步,只要没有任何变化,就会评估附加到所有 $scope 的每个观察者。如果摘要循环中不再发生更改,则认为它已完成。您可以在控制器中显式地将对象附加到 $scope 对象,或者直接在视图中以 {{expression}} 形式声明它们。

SRC:读这个

于 2015-04-09T12:37:40.267 回答