2016-12-21 6 views
1

私は以下のようなディレクティブテンプレートを持っています。ディレクティブテンプレート内で角2方向バインディングが機能しない

(function() { 
    'use strict'; 

    angular 
     .module('testApp', []) 
     .directive('leftNav', leftNav); 

    /* @ngInject */ 
    function leftNav() { 
     return { 
     replace : true, 
     restrict: 'E', 
     template: '<div class="left-nav">' + 
     '<left-header title="{{LeftNavCtrl.titleName}}">' + 

     '</left-header>' + 
     '</div>', 
     controller: LeftNavController, 
     controllerAs: 'LeftNavCtrl', 
     bindToController: true 
     } 
    } 

    function LeftNavController($modal, $scope) { 

     var vm = this; 


     vm.titleName = "first"; 

     $scope.$on('changeTitle', function(event, args) { 
     vm.titleName = "second"; 
     }); 

    } 
})(); 

ここで、ページが初めてレンダリングされると、タイトルは「最初」になります。 他のディレクティブのボタンをクリックすると、イベントが発生し、$ scope.onが呼び出されますが、新しい値はレンダリングされません。

ありがとうございます。

+1

? – Yaser

+0

'controllerAs'では、コントローラ本体で' this'を使うべきではありませんか? – Piou

+0

実際のコードで更新されました。まだ動かない。 –

答えて

0

以下は私にとってうまくいきます。 私はコントローラーでこれを使用します。これはコントローラーとして推奨される構文です。

$on関数では、ローカル変数にも影響します。

オリジナルのスニペットでは、何も表示されません。titleNameの補間はleft-headerタグのタイトル属性のレベルにあります。あなたが時計に最初のもののために$ scope.titleNameを使用して、vm.titleNameている理由

angular 
 
     .module('testApp', []) 
 
     .directive('leftNav', leftNav) 
 
     .directive('button', ['$rootScope', button]); 
 

 
    /* @ngInject */ 
 
    function leftNav() { 
 
     return { 
 
     replace : true, 
 
     restrict: 'E', 
 
     template: '<div class="left-nav">' + 
 
     '<left-header title="{{LeftNavCtrl.titleName}}">{{LeftNavCtrl.titleName}}' + 
 
     '</left-header>' + 
 
     '</div>', 
 
     controller: LeftNavController, 
 
     controllerAs: 'LeftNavCtrl' 
 
     } 
 
    } 
 

 
    function button($rootScope) { 
 
     return { 
 
     replace : true, 
 
     restrict: 'E', 
 
     template: '<div class="left-nav" ng-click="changeTitle()">Broadcast' + 
 
     '</div>', 
 
     link: function($scope){ 
 
      $scope.changeTitle = function(){ 
 
      $rootScope.$broadcast('changeTitle'); 
 
      } 
 
     } 
 
     } 
 
    } 
 

 
    function LeftNavController($scope) { 
 
     var ctrl = this; 
 
     ctrl.titleName = "first"; 
 

 
     $scope.$on('changeTitle', function(event, args) { 
 
     ctrl.titleName = "second"; 
 
     }); 
 

 
    }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.2/angular.min.js"></script> 
 

 
<div ng-app="testApp"> 
 
    <left-nav> 
 
    </left-nav> 
 
    <button></button> 
 
</div>

+0

こんにちは、emitイベントは他のディレクティブから起きていて、この場合はうまくいきません。 –

+0

ディレクティブが兄弟または親である場合、$ emitは機能しません。 私は '$ rootScope'の注入と' $ rootScope。$ broadcast( 'changeTitle') 'の使用をお勧めします。 – Piou

+0

$ emitは動作していますが、$ onの値を変更して反映されません。 –

関連する問題