2017-05-09 3 views
0

J'essaie de transmettre une variable de la méthode de résolution du $ routeProvider au contrôleur qui serait utilisé pour cette route. mais ce qui se passe est que l'objet est en cours de résolution mais le contrôleur n'attend pas jusqu'à la résolution de l'objet. ici est un extrait du code que je utilise:Passage d'un objet de la route au contrôleur via le fournisseur de route résolution

app.config(["$locationProvider", "$routeProvider", "$httpProvider", function ($locationProvider, $routeProvider, $httpProvider) { 
     $locationProvider.hashPrefix(''); 
    .when("/EditProduct/:id", 
      { 
       templateUrl: "App/Products/editProductView.html", 
       controller: "EditProductCtrl as vm", 
       resolve: { 

        product: function (productsResource, $route, $routeParams) { 
         console.log($route.current.params.id); 
         return productsResource.getProductById().get({ id: $route.current.params.id }, function (data) { 
          console.log("inside the resolved function"); 
          console.log(data.Name); 
          return data; 
         }) 
        } 
       } 
      }) 
      .otherwise({ redirectTo: "/" }); 

de sorte que le message du journal avec le nom de l'instruction app.js est représentée. tandis que le contrôleur a supposé résolu le produit injecté comme suit:

(function() { 
    "use strict"; 
    angular.module("ProductManagementTool").controller("EditProductCtrl", ["product","productsResource", "currentUser", EditUserCtrl]); 

    function EditProductCtrl(product, productsResource, currentUser) { 
     var editCtrlViewModel = this; 
     console.log("the full name is " + product.Name); 
      editCtrlViewModel.product = product; 
      editCtrlViewModel.title = "Edit: " + product.Name; 


    } 
}()); 

tandis que le message de journal dans le dispositif de commande est représenté comme étant indéfinis.

J'utilise angulaire js 1.6.1.

Répondre

0

Le contrôleur n'attend pas, car l'élément résolu est une Promesse retournée par $ resource (je suppose que vous utilisez $ resource). Vous devriez faire quelque chose comme ceci:

var editCtrlViewModel = this; 
product.$promise.then(function (element) { 
    editCtrlViewModel.product = element; 
    editCtrlViewModel.title = "Edit: " + element.Name; 
}) 
+0

Merci cela fonctionne. mais ce que je m'attendais à ce que le contrôleur ne soit pas initialisé jusqu'à ce que l'objet est résolu en premier, a été mis à jour récemment ??? – user1874288

+0

@ user1874288 Vous avez raison, mais l'objet est "résolu" - ce qui signifie a renvoyé la valeur ('return productsResource.getProductById()') et il renvoie la promesse - et la promesse est résolue séparément. Si vous avez besoin d'injecter, par exemple, 'productId' comme' return $ route.current.params.id) 'ce n'est pas une Promesse et il n'a pas besoin de" résolution supplémentaire ". –