ルートスコープ内の解決された日付にアクセスする方法
-
21-12-2019 - |
質問
私のアプリでは、resolve
句を使用してサーバーからさまざまなリソースを取得する州があります。
私はまた、これらのリソースへのアクセスが必要な global コントローラを持っています。たとえば、これらのリソースのデータを表示する必要があるブレッドクラムを検討してください。
グローバルコントローラからこれらのリソースにアクセスする方法は?州オブジェクトを手に持っていても、解決されたプロパティの抽出方法を理解することはできませんでした。
編集: ui-router パッケージを使用しています。
解決 2
アイデアは、必要なデータに依存する解決キーを追加することです(下記のコードのbreadcrumb
を参照)。このキーの機能が呼び出されたら、データitem
が使用できるようになっていることを保証できます。次に、状態(data
プロパティ)に入れます。
.state('some.item.detail.state', {
url: '/:itemId',
resolve: {
item: function($stateParams, MyServerResource) {
return MyServerResource.get({itemId: $stateParams.itemId}).$promise;
},
breadcrumb: function(item) {
this.data = item;
}
},
templateUrl: 'myTemplate.html'
}
.
グローバルコントローラのデータを消費するには、$state.current.data
を簡単に検討します。
他のヒント
私はそれを理解しているようにあなたはこのようなものを持っています:
.when('/', {
controller: 'HomeCtrl',
templateUrl: 'home.html',
resolve: {data: someDataFetcher}
})
.
グローバルコントローラのデータにアクセスする必要があります。私はあなたが欲しいものを完全に理解するためのコード例を見る必要があるでしょうが、私は共有サービスを使うことをお勧めします。
function HomeCtrl (data, myDataService) {
myDataService.data = data;
}
function GlobalCtrl (myDataService) {
myDataService.data // => The data
}
.
サービスには1つのインスタンスが1つしかありません。コントローラ間で状態とリソースを共有するために使用するのは簡単です。
これが役立つことを願っています。
更新:
解決閉鎖を作成する:
var myResolveClosure = function (resolver) {
// Return a wrapper around the resolver
return function (globalController, $q) {
var deferred = $q.defer();
resolver($q).then(function (data) {
globalController.addData(data);
deferred.resolve(data);
}).catch(function () {
deferred.reject();
});
return deferred.promise;
}
}
.when('/', {
controller: 'HomeCtrl',
templateUrl: 'home.html',
resolve: {
data: myResolveClosure(function ($q) {
var deferred = $q.defer();
// do something and resolve with the data
return deferred.promise;
})
}
})
.
基本的にあなたはそのデータを取得するために必要な特定のレゾルバを渡します。"MyResolveClosus"はリゾルバの周囲に関数をラップし、いくつかのフェッチを実行するために特定のリゾルバに$ Qを渡します。その後、特定のリゾルバから解決され、それをグローバルコントローラに渡してから、それを解決してから、指定したコントローラもデータを取得するように解決します。
これが理にかなっていることを願っています: - )