4

通常、AngularJS のすべての例/ソース コードでは、スコープの変更はコントローラーで行われます。私のディレクティブでは、別のディレクティブ(またはそのスコープ)からいくつかの情報を取得し、それをスコープに入れる必要があります(ディレクティブのテンプレートに表示されます)。この情報はこのディレクティブのすべてのインスタンスに共通であるため、スコープ バインディングを使用するのは適切ではありません。

したがって、私が見つけた唯一の解決策は、リンク関数でインスタンススコープを変更することです:

link: function(scope, element, attr, parentCtrl) {      
  scope.data = parentCtrl.someData;      
}

このソリューションは機能します。プランクの例

質問: AngularJS の哲学/スタイルに従って、関数のリンクでスコープを変更しても問題ありませんか、それとも別の解決策がありますか?

4

2 に答える 2

1

ディレクティブで分離スコープを作成しているため(例のplnkrで)、親がスコープ階層の「どこかに」あることを許可したいので(@MathewBergへのコメントによると)、唯一のオプションは使用することだと思いますスコープを変更するためのリンク機能。

(子ディレクティブのみが呼び出されるように MainCtrl でメソッドを定義できると思いますが、それを強制すると、面倒でカプセル化が壊れます)。

したがって、@MathewBerg がすでに言ったことを反映するには、はい、ディレクティブ/リンク関数のスコープを変更します。

于 2012-12-26T17:59:23.093 に答える
1

ディレクティブでスコープを変更しても問題ありません。ディレクティブ間で情報を共有するには、いくつかの方法があります。1つは、親コントローラーにアクセスしてそのデータを取得する、あなたが説明した方法です。別の非常によく似た方法は、

scope.data = scope.$parent.data;  

それ以外の

scope.data = parentCtrl.someData;  

ただし、ディレクティブ間で情報を共有する一般的な方法は、サービスを使用することです。これにより、サービスを各ディレクティブに挿入でき、値を共有できます。最初の方法 (および私が説明した方法) の問題は、スコープの階層が変更されるように要素を移動すると、コードが壊れてしまうことです。これが、両方よりもサービスを使用することをお勧めする理由です. service docsを読むことをお勧めします。設定方法を説明したビデオもたくさんあります: http://www.youtube.com/watch?v=1OALSkJGsRw

于 2012-12-26T16:06:23.157 に答える