UI-Routerの解決結果をUI-Routerの別の解決方法に渡そうとしていますが、これを行うたびに次の(ネストされた)メソッドが解決しないことがあります。UIルータのネストされた解決が解決しない
(SubscriptionId
と呼ばれる)アクセスチェックに関連するパラメータを渡し、(ここではSellerData
と呼ばれる)は、ユーザーに関する情報を解決し、(sanitizedProduct
)このコードのすべてが独立している場合に動作し、これら2つの値を使用していくつかの情報を取得する必要があります以下のコードI結果をメソッドにハードコードします(つまり、SellerData.product.id
をの値に置き換えます)。解決されたオブジェクトを渡すと、コードは失敗し、結果のページはロードされません。
これは問題のネストされた性質について間違っている可能性がありますが、私はこの問題に関する多くの情報を見ていないのではないかと心配しています。時間を隔離するもの。 Estusからthis answerに基づき
UPDATE 3.19
それは私が約束して間違いを作ってるんだ(私は愚かな解決の呼び出しが同期したと想定していた)が、コードはまだ適切に解決されていない明らかです。このバージョンでは、両方のSellerData
とSubscriptionId
決意適切かつ正しい順序ではなくgetSanitizedProduct
方法が
.state('subscriberArea', {
url: '/:creatorUsername/subscriber',
templateUrl: 'modules/subscriber/client/views/subscriberArea.client.view.html',
controller: 'SubscriberAreaController',
controllerAs: 'vm',
resolve: {
SellerData: getSellerData,
SubscriptionId: getSubscriptionId,
sanitizedProduct: getSanitizedProduct,
},
data: {
pageTitle: 'Subscriber'
}
})
と呼ばれていないこと
getSellerData.$inject = ['$stateParams', 'UserData', '$q', '_'];
function getSellerData($stateParams, UserData, $q, _){
// Creates query to be passed to 'UserData' service that queries mongo
var deferred = $q.defer();
var query = {'username': $stateParams.creatorUsername};
return UserData.findOne(query).then(function(seller){
// Adds essential information from query to new object that will be returned to the resovle
var sellerData = {};
sellerData._id = seller._id;
sellerData.product.id = seller.product.id;
deferred.resolve(sellerData);
return deferred.promise;
});
}
場合は検索を結合以下の方法およびページで使用されるように、売り手の情報を取得します。ユーザーオブジェクトの値(「認証」と呼ばれます)がgetSellerDataから解決された製品IDと一致し、その値を「SubscriptionId」の解決として設定します。
getSubscriptionId.$inject = ['Authentication', '_', '$q', 'SellerData'];
function getSubscriptionId(Authentication, _, $q, SellerData){
var promises = [SellerData];
$q.all(promises).then(function(resolved){
var sellerData = resolved[0];
var subscriptionId = _.intersection(Authentication.user.purchases, sellerData.product.id);
deferred.resolve(subscriptionId);
return deferred.promise;
})
}
クエリ解決SellerDataとSubscriptionId情報
getSanitizedProduct.$inject = ['ProductData', 'SellerData', 'SubscriptionId', '$q'];
function getSanitizedProduct(ProductData, SellerData, SubscriptionId, $q){
var promises = [SellerData, SubscriptionId];
$q.all(promises).then(function(resolved){
var sellerData = resolved[0]
var subscriptionId = resolved[1]
var productId = sellerData.product.id;
var versionId = {'version': subscriptionId};
return ProductData.getWhitelistedData(productId, versionId).then(function(product){
// plain() is a Restangular method that strips unnecessary properties
return product.plain();
});
}
}
ORIGINAL
基本的なUI-ルータのセットアップとデータベース:
.state('subscriberArea', {
url: '/:creatorUsername/subscriber',
templateUrl: 'modules/subscriber/client/views/subscriberArea.client.view.html',
controller: 'SubscriberAreaController',
controllerAs: 'vm',
resolve: {
SellerData: getSellerData,
SubscriptionId: getSubscriptionId,
sanitizedProduct: getSanitizedProduct,
},
data: {
pageTitle: 'Subscriber'
}
})
は、以下の方法で使用されるように、売り手の情報を取得します。ページバインディング
getSellerData.$inject = ['$stateParams', 'UserData', '_'];
function getSellerData($stateParams, UserData, _){
// Creates query to be passed to 'UserData' service that queries mongo
var query = {'username': $stateParams.creatorUsername};
return UserData.findOne(query).then(function(seller){
// Adds essential information from query to new object that will be returned to the resovle
var sellerData = {};
sellerData._id = seller._id;
sellerData.product.id = seller.product.id;
return sellerData;
});
}
(認証として知られている)ユーザオブジェクトの値がgetSellerDataから解決プロダクトIDと一致する場合、検索し、「SubscriptionId」解決
getSubscriptionId.$inject = ['Authentication', '_', 'SellerData'];
function getSubscriptionId(Authentication, _, SellerData){
return _.intersection(Authentication.user.purchases, SellerData.product.id);
}
クエリ解決SellerDataとSubscriptionId持つデータベースとしてその値を設定します情報 getProduct。$ inject = ['ProductData'、 'SellerData'、 'SubscriptionId'];
function getSanitizedProduct(ProductData, SellerData, SubscriptionId){
var productId = SellerData.product.id;
var versionId = {'version': SubscriptionId};
return ProductData.getWhitelistedData(productId, versionId).then(function(product){
// plain() is a Restangular method that strips unnecessary properties
return product.plain();
});
}
エラーが発生した場合はエラーが発生しますか? – Brad