2

2 つのオブジェクト モデル model1:{name:"foo"} model2:{name:"model2"} を持つフォーム コントローラーがあります。2 つのディレクティブを作成しました (どちらも分離スコープを作成します)。1 つはモデル 1 を使用する要素のみのバインドで、もう 1 つはモデル 2 を使用する属性のみのバインドです。

ネスティングは次のようになります。

 <div myattibute="model2">
   <mytag my-model="model"></mytag>
 </div>

属性のみのディレクティブにはテンプレートがなく、タグ ディレクティブにはテンプレートがあります。

問題は、モデルの mytag ディレクティブで未定義になっていることです。

1.誰かが問題を見て、plnkr で説明できますか?

http://plnkr.co/edit/Q23XqY?p=preview


部分的な解決策: myattribute ディレクティブに ng-transclude のみを使用して空の div テンプレートを追加する実際の例は、それを機能させます。この属性ディレクティブが div にあることを義務付けたので、任意の div やスパンなどに配置できるようにしたいと考えていました。実際の例は次のとおりです

2 .ng-transclude はスコープの継承にどのように影響しますか?
3 .マークアップなしでビジネス ロジックのみでこの属性を作成することはできませんか?

4

1 に答える 1

1

アイソレート スコープは、不要な複雑さを追加するまれなケースを除いて、避けるのが最善です。$scope.$watch を使用して、次のように属性の式にバインドする方がはるかに簡単です。

$scope.$watch(attrs.myModel, function(newValue, oldValue) {})

$scope.$watch(attrs.myattribute, function(newValue, oldValue) {})

このようにして、ディレクティブは、宣言された親スコープを共有し、 $watch 式を使用してバインディングを処理するか、必要に応じて子スコープを作成できます{ scope: true }

考えられる解決策の 1 つを次に示します: http://plnkr.co/edit/mm2q67?p=preview

本当にそのようにしたい場合は、myTagディレクティブでisolateスコープを使用できmyattributeますが、スコープの継承チェーンが壊れるため、使用できないことに注意してください。myTag

于 2013-10-26T16:56:50.000 に答える