2017-05-15 2 views
0

私は、AngularJS Developer Guideの例を使用してタブ付きインターフェイス(https://docs.angularjs.org/guide/component - インターコンポーネント通信)を作成しています。 静的コンテンツの場合、すべて正常に動作しますが、基礎となるドキュメント(データ)構造を更新すると、タブのリストは新しいコンテンツのタブだけで拡張され、前のタブは何も表示されません(そのコンテンツは消えます)。 タブコントローラを更新するには「角のある方法」が必要であると確信しています。そのため、いつでもペインコントローラの実際の内容が反映されます。 $ onInit()または$ onChanges()を使用してみると(以下のコードでコメントとして表示されます)、タブが完全に削除されます。 おそらく(うまくいけば)2つのコンポーネントの間に適切なバインディングがありませんが、どうやってそれを行うのか分かりません。ここでタブ付きコンテンツのanglejsコンポーネントインタラクション

は私のコードです:

HTML:

<div class="alert alert-danger"> 
    <serv-tabs> 
    <acp-service srv="srv" ng-repeat="srv in data.services"></acp-service> 
    </serv-tabs> 
</div> 

はJavaScript:

app.component('acpService', { 
    template: 
     '<serv-pane title="{{$ctrl.srv.LABEL}}">'+ 
     ' <div>SIK: <input type="text" ng-model="$ctrl.srv.SIK">&nbsp;'+ 
     ' <input type="button" class="btn-torch" ng-click="$ctrl.searchForServ()"></input>'+ 
     ' </div>'+ 
     '</serv-pane>', 

    bindings: { 
    srv: '=' 
    }, 
    controller: function AcpServiceController($rootScope, AcpModel) { 
    // Data model ----------------------------- 
    var acpdata = AcpModel.getData(); 
    this.services = acpdata.services; 

    // Event handlers ------------------------- 
    this.searchForServ = function() { 
     $rootScope.DEBUG = "searchForServ("+this.srv.SIK+") was triggered"; 
    }; 
    } 
}); 


// TAB navigation for services 
app.component('servTabs', { 
    transclude: true, 
    controller: function ServTabsController() { 
    var panes = this.panes = []; 

    this.$onInit = function() { 
     //panes = []; 
     console.log('servTabs::onInit() called'); 
    }; 
    this.$onChanges = function(chObj) { 
     //this.panes = []; 
     //panes.length = 0; 
     console.log('servTabs::onChanges() called'); 
    }; 
    this.select = function(pane) { 
     angular.forEach(panes, function(pane) { 
     pane.selected = false; 
     }); 
     pane.selected = true; 
    }; 
    this.addPane = function(pane) { 
     if (panes.length === 0) { 
     this.select(pane); 
     } 
     panes.push(pane); 
    }; 
    }, 
    template: 
    '<div class="tabbable">\n'+ 
    ' <ul class="nav nav-tabs">\n'+ 
    ' <li ng-repeat="pane in $ctrl.panes" ng-class="{active:pane.selected}">\n'+ 
    '  <a href="" ng-click="$ctrl.select(pane)">{{pane.title}}</a>\n'+ 
    ' </li>\n'+ 
    ' </ul>\n'+ 
    ' <div class="tab-content" ng-transclude></div>\n'+ 
    '</div>\n' 
    }); 
app.component('servPane', { 
    transclude: true, 
    require: { 
    tabsCtrl: '^servTabs' 
    }, 
    bindings: { 
    title: '@', 
    }, 
    controller: function() { 
    this.$onInit = function() { 
     this.tabsCtrl.addPane(this); 
     console.log(this); 
    }; 
    this.$onChanges = function(chObj) { 
     console.log('servPane::onChanges() called'); 
    }; 
    }, 
    template: '<div class="tab-pane" ng-show="$ctrl.selected" ng-transclude></div>' 
}); 

AcpModelは、バックエンドからのサービスの新しいリストを取得し、コンテンツブロック(servPane)することができます大丈夫ですが、タブリスト(servTabs)は単に拡張されます。

誰かが何をすべきかについてのヒントはありますか?

答えて

0

あなたが拡張取得することにより、tabsCtrlを避けるために必要がある場合は、最終的には、タブのリストからこのservPaneインスタンスを削除することができ$onDestroyライフサイクルイベントのために、servPaneフックに提供する必要があります。

+0

ありがとうございました:) servTabs :: delPane(ペイン)メソッドと、delPane(this)を呼び出すservPane :: $ onDestroy()を追加しました。 –

関連する問題