2016-03-21 25 views
0

UI-Routerの解決結果をUI-Routerの別の解決方法に渡そうとしていますが、これを行うたびに次の(ネストされた)メソッドが解決しないことがあります。UIルータのネストされた解決が解決しない

SubscriptionIdと呼ばれる)アクセスチェックに関連するパラメータを渡し、(ここではSellerDataと呼ばれる)は、ユーザーに関する情報を解決し、(sanitizedProduct)このコードのすべてが独立している場合に動作し、これら2つの値を使用していくつかの情報を取得する必要があります以下のコードI結果をメソッドにハードコードします(つまり、SellerData.product.idを​​の値に置き換えます)。解決されたオブジェクトを渡すと、コードは失敗し、結果のページはロードされません。

これは問題のネストされた性質について間違っている可能性がありますが、私はこの問題に関する多くの情報を見ていないのではないかと心配しています。時間を隔離するもの。 Estusからthis answerに基づき

UPDATE 3.19

それは私が約束して間違いを作ってるんだ(私は愚かな解決の呼び出しが同期したと想定していた)が、コードはまだ適切に解決されていない明らかです。このバージョンでは、両方のSellerDataSubscriptionId決意適切かつ正しい順序ではなく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(); 
    }); 
} 
+0

エラーが発生した場合はエラーが発生しますか? – Brad

答えて

0

SellerDataSubscriptionIdは、それらがルートコントローラに固有の、ローカル依存性です。コントローラーのローカル依存関係は、アプリケーション全体に注入することはできません。この点でもリゾルバーは異なりません。ルート・レゾルバが注入できる唯一の場所はルート・コントローラです。

さらに、resolveはオブジェクトであり、配列ではありません。つまり、リゾルバの実行順序は保証されません。約束は、彼らがを実行し、は、特定の順序でを解決しなければならない場合は特定の順序でを実行、またはそれらの連鎖であることを持っている場合は、必ず$q.allを使用しています。

リゾルバ(SellerDataSubscriptionIdsanitizedProduct)のすべての

は、ルートリゾルバとして使用する必要があり、別のサービス(最も可能性が高い serviceなく factory)、チェーン( sanitizedProduct)で最後になるはずです。

+0

これは本当に役に立ちましたが、私はまだいくつかの問題があります。私はUI-Routerを初めて使っているだけで、頭が痛むことはありません。私の更新された投稿を見ていただけますか?私は基本的なものを見落としていると思う。 – brokyo

+0

@brokyo回答に記載されているように、* resolvers(SellerData、SubscriptionId、sanitizedProduct)は別のサービスになるはずです。そして現在、彼らはそうではありません。だから彼らはお互いに注射することはできません。インジェクターのエラーがスローされます。コンソールでエラーをチェックし、$ stateChangeErrorイベントを聞いてルートリゾルバの拒否を記録してください。 – estus

+0

ああ、私の謝罪。私は物事に必要なものではなく、スタイルの提案としてそれを読んでいます。私が愚かな質問だと確信しているのは間違いですが、例えばSellerDataは 'getSubscriptionId'で動作し、値にアクセスできます。注射の理由はどこにあるのですか?(私は頭がおかしくなってきているのは確かです) – brokyo

関連する問題