2016-12-12 10 views
0

私のアプリで複数の共有データサービスの問題に直面しましたが、ここで説明しようとします。AngularJS、共有データサービスが複数回トリガされました

コントローラ 'home'を持つホームページでは、ユーザーがアイテム(たとえば最初のもの)の1つを選択した後で、このビューにリダイレクトして、表'。ビューにはテーブルとタブが下にあり、それぞれのタブには独自のコントローラ 'tab1 and etc'があります。行をクリックすると、タブのコントローラ間でこの行のIDを共有しています。このタブは、この特定の行に関連するコンテンツをロードできます。今のところすべてがうまくいく。

次に、ユーザーがボタンのホームをクリックすると、ホームページにリダイレクトされ、アイテム(たとえば最初のアイテムなど)を再度クリックすると、共有サービスが2回トリガーされ、同じIDが3回時間シェアサービスが3回などトリガされます。

私のコードの下で、私が誰かが私に説明してくれれば幸いです。前もって感謝します。

app.controller('table', [ 
     '$scope', 'tab1ID', 'tab2ID', 'tab3ID' 
     function ($scope, tab1ID, tab2ID, tab3ID) { 

      $scope.rowSelection($scope, function (row) { 

        tab1ID.setId(row.id); 
        tab2ID.setId(row.id); 
        tab3ID.setId(row.id) 

       }); 

    app.controller('tab1', [ 
     '$scope', 'tab1ID', dataService 
     function ($scope, tab1ID, dataService) { 

     tab1ID.getId().then(null, null, function (id) { 

// return increment count of 'id' after redirecting from home view to table view 
// dataService firing for each incremented id (1 for 1, 2 for 2 and etc) 

      dataService.rowData(id) 
       .then(function (res) { 

       $scope.data = res; 

      }) 
     }); 

    .factory(
     'tab1ID', function ($q) { 

      var self = this, 
       defer = $q.defer(); 

      this.share = ''; 

      return { 
       getId: function() { 
        return defer.promise; 
       }, 
       setId: function (id) { 

        self.share = id; 
        defer.notify(self.share); 
       } 
      } 
     } 
    ); 

答えて

1

最後に、複数のトリガーを打つ方法を考えました。私は、来るべきidの新しい変数を宣言し、その変数の変更をフォローするように角度ウォッチを設定しました。おそらくこれは醜い方法ですが、それは私にとっては役に立ちます

tab1ID.getId().then(null, null, function(id){ 
     $scope.id = id 
    }); 

    $scope.$watch('id', function (newVal, oldVal) { 

     if (typeof newVal !== 'undefined') { 

      dataService.rowData(id) 
       .then(function (res) { 

      $scope.data = res; 
     }) 
    }) 
関連する問題