2016-11-01 6 views
1

私はHTML <p>タグに基づいて非常に単純なパラグラフ指令を作成しました。ng-transcludeを使用したangleディレクティブ

angular.module('myApp').directive('paragraph', function() { 
    return { 
    restrict: 'E', 
    transclude: true, 
    controller: function() { 
     var vm = this; 
     vm.text = "Paragraph text from controller" 
    }, 
    controllerAs: 'ParagraphViewModel', 
    template: '<p ng-transclude>{{ParagraphViewModel.text}}</p>' 
    } 
}); 

私は次のように私のhtmlでそのディレクティブを使用しています:

<paragraph>This is a very simple paragraph</paragraph> 
<paragraph></paragraph> 

そして私は、私はParagraphViewModel.textにそれをバインドされてきた入力を持っています。

<input type="text" ng-model="ParagraphViewModel.text"> 

私は入力を変更すると、問題は、予想されるように、第2 <paragraph>変化である、しかし、最初のものの値にはありません。

this JSBinにご確認ください。

答えて

1

ここで達成しようとしていることは、ディレクティブにデフォルトのテキストを渡し、バインドされた入力でそれを変更することです。

これは、分離スコープを使用することで実現できます。ここではあなたがそれを行う必要があります方法は次のとおりです。あなたののApp

<div ng-app="myApp"> 

    <paragraph pgtext="Foo" pgmodel="bar"></paragraph> 
    <paragraph>{{bar}}</paragraph> 
    <input type="text" ng-model="bar"> 

</div> 

:あなたのビュー

angular.module('myApp',[]); 

angular.module('myApp').directive('paragraph', function() { 
return { 
    restrict: 'E', 
    transclude: true, 
    scope: { 
     pgmodel: '=', 
     pgtext: '@' 
    }, 
    template: '<p ng-transclude>{{pgmodel || pgtext}}</p>' 
    } 
}); 

DEMO:JSBin

2

特にexampledocsをもう一度見てください。

あなたは角度が

<paragraph>This is a very simple paragraph</paragraph> 

でコンテンツをtranscludes <p ng-transclude>のすべてのコンテンツが<paragraph>タグからコンテンツに置き換えられますので、それは完全におよそ{{ParagraphViewModel.text}}ディレクティブのテンプレートに結合するのを忘れたときに、参照してください。

2番目のケースは、単にコンテンツの置換が行われず、Angularのデフォルトがテンプレートのコンテンツのデフォルトになるためです。

+0

ので、どんな解決策がありますこのため? – sadrzadehsina

+0

何の解決策ですか? :)これは、このように動作するはずです。達成しようとしている動作は何ですか? –

+0

@Dennisがポイントを獲得しました。 ng-transcludeを使用している場合、Angularはタグを置き換えます。 –

関連する問題