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 の世界の外で何らかの値を変更し、変更が正常に反映されることを確認したい場合があります。これを考慮してください - jQuery の $.ajax() ハンドラー内で変更される $scope.myVar 値があります。これは、将来のある時点で発生します。Angular は、jQuery を待機するように指示されていないため、これが発生するのを待つことができません。これに取り組むために、$apply が導入されました。消化サイクルを明示的に開始できます。でも、

これらすべてが DOM とどのように関連しているのでしょうか?

さて、これですべてがわかったので、もう一度チュートリアルに従う必要があります。ダイジェスト サイクルは、何も変更がない限り、すべての $scopes にアタッチされたすべてのウォッチャーを評価することにより、UI と JS コードの同期が維持されるようにします。ダイジェスト ループでそれ以上変更が発生しない場合は、終了したと見なされます。コントローラーで明示的に、またはビューで直接 {{expression}} 形式で宣言することにより、オブジェクトを $scope オブジェクトにアタッチできます。

SRC:これを読んで

于 2015-04-09T12:37:40.267 に答える