1

angular-uiタブdirectiveを使用して、各タブのクリックで異なるコントローラから異なる機能を呼び出そうとしています。角度uiタブの各タブをクリックすると、異なるコントローラから異なる機能を呼び出す方法はありますか?

HTML

<tabset> 
    <tab heading="Reports" ng-controller="ReportsController" ng-click="fetchReports()" id="tab1"> 
    <div> Reports </div> 
    </tab> 
    <tab heading="Sales" ng-controller="SalesController" ng-click="fetchSales()" id="tab2"> 
    <div> Sales </div> 
    </tab> 
</tabset> 

私は新しい/孤立範囲を求め、この

複数のディレクティブ[ngController、タブ]のようなエラーを取得しています

要件

I have 5-6 tabs in a page. The page should not load the data of each tab at once. It should only load data for a tab once that tab is being clicked.

ソリューション

私は私がその後、ParentControllerからbroadcastのイベントは、それぞれのChildコントローラからの関数を呼び出すことができますようparent controllertabsetディレクティブをラップするためのソリューションを持っています。

<div ng-controller='ParentController'> 
    <tabset> 
    <tab heading="Reports" id="tab1"> 
     <div ng-controller="ChildOneController"> Reports </div> 
    </tab> 
    <tab heading="Sales" id="tab2"> 
     <div ng-controller="ChildTwoController"> Sales </div> 
    </tab> 
    </tabset> 
</div> 

問題:

しかし、悲しいことに、私は自分のアプリケーション内のタブと、あまりにも多くのページを持っていると私はParentControllerからChildControllerに各タブのイベントを放送することは良いアイデアだと思ういけません。 私はそれに適した解決策を知る必要がありますか?

答えて

2

あなたは構文として、コントローラを使用することができます。ここでは

<div ng-controller="ReportsController as reports"> 
    <div ng-controller="SalesController as sales"> 
    <tabset> 
     <tab heading="Reports" ng-click="reports.fetchReports()" id="tab1"> 
     <div> Reports </div> 
     </tab> 
     <tab heading="Sales" ng-click="sales.fetchSales()" id="tab2"> 
     <div> Sales </div> 
     </tab> 
    </tabset> 
    </div> 
</div> 

は、コントローラがどのように見えるかの例です:

(function(){ 

    angular 
    .module('app') 
    .controller('ReportsController', [ 
     ReportsController 
    ]); 

    function ReportsController() { 
    var vm = this; 

    vm.fetchReports = function() { 
     // fetch the reports! 
    }; 
    } 

})(); 

出典:ジョン・パパの角度スタイルガイドは、コントローラを使用することをお勧めします$ scope上の 構文として、style guideを参照してください。あなたのケースでは

+0

私はあなたのソリューションが、何についての場合、私は5-6のタブを持っているが好きな..?このスタイルに従って、私はタブセットの周りに各コントローラをラップする必要があります。私はこれが良い考えだとは思わない。あなたは何を言っていますか ? –

+0

はい、複数のコントローラーを必要に応じて定義する方法の例です。 現実的には(このシナリオでは)、必要なすべての機能を備えた単一のコントローラを定義するか、機能をさらにサービス/工場に分けるか、Alvaroのソリューションでディレクティブがどのようになるかを示しますそれ自身のコントローラーで作成されます。そのタブのすべてのロジックが1つのモジュールに含まれます。 –

1

あなたはdirective作成する必要があります:あなたが倍数に倍数コントローラと ディレクティブを作成するためにloopを使用することができます。このように

を。

(function() { 
 

 
    angular 
 
     .module('app') 
 
     .diretive('directiveTab', function() { 
 
      return { 
 
      restrict: 'AE', 
 
      template: " <div> Reports </div>"//you can use templateUrl as well 
 
      scope: {}, 
 
      controller: ['$scope', 
 
       function($scope) { 
 
       $scope.function1 = function(pane) { 
 
        
 
       }; 
 
       } 
 
      ], 
 
      }; 
 
     } 
 
     })
the directive will behave like controller and you can manipulate the content of each tab 
 

 
<div ng-controller='ParentController'> 
 
    <tabset> 
 
    <tab heading="Reports" id="tab1"> 
 
     <directive-tab> 
 
    </tab> 
 
    </tabset> 
 
</div>

+0

異なるタブに異なるコントローラを使用する理由は、異なるタブに異なるコントローラで定義された異なるエンティティがあるためです。私はちょうど1つに異なるコントローラをマージすることはできません。 –

+0

@Ahmadhamza私の新しい答えを気にしてください –

+0

申し訳ありませんが、私は少し混乱しています。私が必要とするすべてのコントローラをループさせる方法と、ディレクティブのタブごとにng-clickの動作を追加する方法は?説明していただけますか? –

関連する問題