0

AngularJsを使用してアプリケーションを構築しているときに、次のことが良い習慣かどうかを自問しました。

私は「AppController」を持っていて、他のすべてのコントローラーはその子です。AppControllerには次のようなものがあります。

$scope.layout = { sidebar: false, searchbar: true};

これで、子コントローラーは次の値を変更できるようになります。

$rootScope.sidebar = true; 

この場合、私の子モジュールは完全にルートコントローラーに依存しており、この子コントローラーを他のアプリケーション内で動作させたい場合は、他のアプリの親コントローラーが常に$scope.layoutオブジェクトを持っていることを確認する必要があります。これは良い習慣ですか?親コントローラーと子コントローラーの両方で使用されるレイアウトモジュールを構築する方がよいでしょうか?以下のコードのように:

angular.module("app.ui", [])
  .factory("Layout", [function(){
     var _sidebar = false;
     var searchbar = true;


     var sidebar = function(flag){
        if(flag !== undefined) _sidebar = flag;
        return _sidebar;
     }

     var searchbar = function(flag){
        if(flag !== undefined) _searchbar = flag;
        return _searchbar;
     }

return {
   sidebar : sidebar,
   searchbar : searchbar
}
}])
4

2 に答える 2

3

あなたがやりたいことへの他のアーキテクチャのアプローチがあるかもしれませんが(例えば、ディレクティブ宣言のスコーププロパティと@、=、&を使用して親スコープの特定のプロパティをバインドするためのその機能に関するドキュメントを調べてください)、一般的にサービスは確かに共通データへのアクセスを共有するための良いオプション。値が更新されたときに発生しなければならない追加のロジックがない場合は、少し単純化できます。

angular.module("app.ui", [])

.service("Layout", function() {
  this.sidebar = false;
  this.searchbar = true;
})

このサービスをコントローラーに挿入してスコープに追加すると、次のように更新して変更をリッスンできます。

.controller("AppCtl", function($scope, Layout) {
  $scope.Layout = Layout;

  // Method called by a search button, say
  $scope.search = function() {
    Layout.searchbar = true;
  }

  $scope.$watch("Layout.searchbar", function(newVal, oldVal) {
    // Do something in this scope if value has been changed from elsewhere
  });

});
于 2012-10-29T05:52:24.333 に答える
0

クリック時にスクロールをトリガーするディレクティブを作成するこのアプローチを試すことができます。 プランカー

于 2014-09-02T08:32:19.550 に答える