2012-09-27 14 views
6

transcludeを使用して新しいスコープを作成する命令を防止するにはどうすればよいですか?AngularJSディレクティブのtransclude scope = false?

このjsfiddle赤い枠で示した新しいスコープのため、何もバインドできません。

HTML:

<div ng-app="components"> 
    <input ng-model="var"> 
    <block> 
     123 
     <input ng-model="var"> 
    </block> 
</div> 

はJavaScript:

angular.module('components', []).directive('block',function(){ 
    return{ 
     scope:false, 
     replace:true, 
     restrict:"E", 
     transclude:true, 
     template:'<div class="block" ng-transclude></div>', 
     link:function(scope, el, attrs, ctrl){ 

     } 
    } 
}); 

CSS:

.ng-scope{ 
    border:1px solid red; 
    margin:10px; 
} 

答えて

6

それが実際に期待されているbehav https://github.com/angular/angular.js/issues/1056 とここで議論:https://groups.google.com/forum/#!msg/angular/45jNmQucSCE/hL8x48-JfZIJ

あなたはこのフィドルのようにスコープ(obj.var)でオブジェクトのメンバを設定することで、この問題を回避することができます:IOR(NG-transcludeは子スコープを作成します)ここに述べたようにhttp://jsfiddle.net/rdarder/pnSNj/10/

+0

感謝。私はより簡単な例を作った[jsfiddle](http://jsfiddle.net/RHLzK/5/)。しかし、それはバグですか、それとも機能ですか? – Jossi

+0

親スコープからプロトタイプを継承しています(つまり、親スコープから読み込むことができますが、書き込むとすぐに子スコープになります)。親スコープのworkaroudでobjを使用しない限り)、おそらくng-transclude指令のソースコードを見て、それをコピーしてスコープで自分自身で作ることができます:falseオプション。 – Guillaume86

+0

「要素」として設定された文字列を使用し始めると、問題が再び発生します。なぜ誰もそれが今働かない理由を知っていますか?デモ:http://plnkr.co/edit/Bv1kFQtzdVzsasHTUrgf?p=preview –

0

これは角度チームによって推奨されていないが、別の問題を回避するには、明示的にトランスクルード部分内の$親スコープを呼び出すことです:

<div ng-app="components"> 
    <input ng-model="var"> 
    <block> 
     123 
     <input ng-model="$parent.var"> 
    </block> 
</div> 
関連する問題