2016-08-23 12 views
1

名前にアクセスするためのテンプレート。すべての良い。アクセス親コントローラn個のレベルが高い

私のテンプレートには、新しいスコープを作成するネストされたディレクティブがあり、下のどこかに私はng = controller = "SubControllerとしてSubCtrl"があります。 subcontroller.propertyを実行してサブコントローラのプロパティにアクセスできるようになりました。コントローラテンプレートが素晴らしいので、そのテンプレート内ではまだmain.nameにアクセスできます。

問題は、私の2番目のコントローラコードでは、親コントローラ内のものにアクセスする必要があります。これは、この時点でnレベル深いものです。私は

$scope.main = this; 

...私はメインコントローラでこのようにこれを行うことができます知っていた後、第2のコントローラ

var main = $scope.$parent.$parent.$parent.$parent.main; 

でこれを行うことが、我々はすべて我々がそれを行うべきではありません知っていると私は勝ちましたとにかく、開発者が新しいスコープを作成するディレクティブをどれだけ配置したのか分かりません。

これはサービスを作成する人がいると聞いていますが、一般的に行うのが難しいように思えますし、自分のフレームワークのユーザーがインクルードを入れるたびにサービスを作成する必要はありませんタブパネル、それは狂っているだろう。

私の現在のアイデアは、スコープを使用し、比較関数を使用して指定したスコープを見つけるまで親スコープをトラバースする関数を書くことです。私は良い方法かもしれないと思う。

+0

地獄の人は何が間違っているのか明らかにすることなく質問を投票しますか?私はそれをかなりうまく説明したと思っており、それは完全に有効な質問です。 – jonhobbs

+0

サービスを作成してみませんか?サービスは、1つ以上のコントローラ、ディレクティブ、ファクトリなどに必要なものにデータやアクセスを格納するのに最適な場所です。基本的にはシングルトンですが、複数の場所に注入しますが、常に同じインスタンスが注入されます。それはあなたが念頭に置いているもの($ parent. $ parent.n .....データ)よりも非常に使いやすく、脆弱です。あなたがユニットテストをしているのであれば、はるかにテスト可能です。 – Igor

+0

私はそこにいましたが、コントローラ間で情報を共有したい場合は、サービスより優れていることを保証します。例:ユーザーinfoServiceに関する情報を格納するサービス。 'mainCtrl'は' infoService.registerUser({name: 'David'}) 'を実行し、' subCtrl'は 'infoService.getLatestUser()'を実行できます。 – pavlag

答えて

2

なぜサービスを作成しないのですか?サービスは、1つ以上のコントローラ、ディレクティブ、ファクトリなどに必要なものにデータやアクセスを格納するのに最適な場所です。その基本的なシングルトンは、複数の場所に注入しますが、常に同じインスタンスが注入され、必要なときに初めて作成されます。それはあなたが念頭に置いているものよりも非常に使いやすく、脆弱ではありません($parent.$parent.n.....data)。あなたがユニットテストをしているのであれば、はるかにテスト可能です。

var module = angular.module('app'); 

module.service('commonService', function() { 
    this.sharedData = {name: ''}; 
}); 

// assume this gets loaded first 
module.controller('MyCtrl1', ['commonService', function (commonService) { 
    commonService.sharedData.name = 'David' 
}]); 

// and this is loaded somewhere after MyCtrl2 
module.controller('MyCtrl2', ['commonService', function (commonService) { 
    var name = commonService.sharedData.name; 
}]); 

私は構文を検証していないが、これは非常に単純な基本構造、です。

+0

OK、grand-grand-parent>子のシナリオがあるたびにこれを行う必要がありますか(タブシステムを持つ私のアプリではまったく同じページです)、サービスにすべて保存することができますか?サービスは、各キーが一意のコントローラ名で、各値がコントローラインスタンスへの参照であるキー値ペアのマップを持つことができますか? – jonhobbs

+0

@jonhobbs - サービスは、一度しか作成されないオブジェクトなので、コントローラへの参照を含めることができます。 OOPのルールとしては、タイプが少ないほど互いのことを知ることができますが、プログラムの柔軟性が高いので、「疎結合」が常に推奨されます。私は共通/共有状態と共通/共有ビジネスロジックを1つ以上のサービス(または共有状態がない場合は工場)に抽象化しますが、これはコントローラがお互いに「通信」するための最良の方法です。 – Igor

関連する問題