2016-05-18 4 views
0

私はベストプラクティスをAngularJs 1.5アプリで採用しようとしています。すでに次Todd Motto'sJohn Papa'sスタイルがAngularJSアプリ内でカプセル化されたディレクティブとルーティングを使用するための推奨される方法は何ですか?

を案内する事はある:私のアプリはngRouteを使用してのルートがあります。したがって、これは:

function RoutingConfig($routeProvider) { 
    $routeProvider 
     .when('/route1', { 
      controller: 'Ctrl1 as vm', 
      templateUrl: 'partials/route1.html', 
      resolve: { myCoolService: myCoolService } // to abbreviate 
     }) 
     .when('/route2', { 
      controller: 'Ctrl2 as vm', 
      templateUrl: 'partials/route2.html' 
     }) 
     .otherwise({redirectTo: '/route1'}): 

} 

angular 
    .module('myApp', ['ngRoute']) 
    .config(RoutingConfig); 

です。ここまでは順調ですね。

それでは、角度2、に私の道で、私はディレクティブアプローチのすべてをカプセル化採用したい、としましょう。このようにして、AngularJS 1.5を使用して、のWebコンポーネントを作成します。私は右のプラクティスに従うてる場合

、私は私のroute1のためのディレクティブを作成し、直接そのディレクティブのためのコントローラを定義することができます。

function MyCoolDirective() { 
    var directiveDefObj = { 
     controller: Ctrl1, 
     controllerAs: 'vm', 
     scope: { 
      data: "=", 
     }, 
     bindToController: true, // isolated scope 
     link: linkFnc // just declared to abbreviate 
    }; 

    return directiveDefObj; 
} 


angular 
    .module('myApp') 
    .directive('MyCoolDirective', MyCoolDirective); 

だから、はどこ私はコントローラを宣言する必要がありますか?ルーティング設定では?各指令の中に?私のために少し冗長な音を出します。上述したように、あなたの例を使用して

+0

実際には2つの別個のコントローラがあります。 1つはルートのためのものであり、その中のすべてはテンプレートであり、もう1つはディレクティブのものであり、そのすべてはテンプレートです。ただし、ルートテンプレートがディレクティブのみを保持し、独自のロジックを持たないという目的がある場合は、コントローラを用意する必要はありません。しかし、実際には、特に、お互いの間で情報を共有する複数のディレクティブを使用する予定がある場合は、両方が必要になります。 – Claies

+0

あなたは本当にルートコントローラをもう必要としません。ルートのテンプレートをディレクティブにして、すべてのコントローラロジックをディレクティブに入れることができます。例えば – rob

+0

はい、これは私の考えです:複雑さを指令に移してください、そして、それは持っていません。(例えば、可能であればルーティングコントローラ。ディレクティブ間の通信(コンテナの外部ディレクティブと含まれる各要素の内部ディレクティブの典型的な例)を処理するために、内部ディレクティブに 'require'を使用できませんでしたか? – jorgeas80

答えて

1

が、これは私が角2 https://docs.angularjs.org/guide/component

(function() { 
    angular 
     .module('AppName') 
     .directive('directiveName', directiveName) 
     .config(routeConfig); 

    directiveName.$inject = ['$compile']; 

    function directiveName($compile) { 
     return { 
      scope: { 
       customAttribute: '=', 
      }, 
      link: directiveLink, 
      controller: directiveController 
     }; 

     function directiveLink(scope) { 

     } 

     function directiveController($scope) { 

     } 
    } 
    routeConfig.$inject ['$routeProvider']; 

    function routeConfig($routeProvider) { 
     $routeProvider.when('/home', { 
      template: '<custom-directive></custom-directive>', 
      resolve: { 
       user: function($http) { return $http.get('...'); } 
      } 
     }); 
    } 
})(); 
の準備中に新しい角度1.5コンポーネントメソッドをチェックアウトをお勧めします私はパパのスタイルガイド

ALAディレクティブでコントローラーを処理する方法であります

+0

ありがとう!それはかなりきれいです。私は実際には「ディレクティブ」の代わりに「コンポーネント」を使用しますが、AngularJSクラスの素材を準備しており、進化を示し、「コンポーネント」の使用を理解し、なぜそこに着いたのかを知りたいと思います。 – jorgeas80

+0

ちょうど別の質問:指示文に$ compileを注入しました。あなたはそれを何のために使うのですか?私が間違っていない場合は、リンク関数とは異なり、インスタンス化の前にディレクティブのDOMを変更することができます。そのための明確なユースケースはありますか? – jorgeas80

+0

コンパイルを使用して、角度を 'そのことをする'ようにします。より具体的には、compileは、テンプレートをレンダリングするためにどの角度で使用されるかです。コンパイルでは、新しいスコープを作成し、そのスコープをテンプレートに即座にバインドすることができます。以下を考慮してください:https://gist.github。com/d3l33t/87adc735266077c2af3840e1a115c1c4 コンパイルを使用して、親スコープへの双方向データバインディングを持つ新しい要素をページに作成できます。親スコープで関数を作成し、子ディレクティブを独立して動作させることができます。 – d3l33t

関連する問題