Передача объекта из маршрута в контроллер через разрешение поставщика маршрутов

Я пытаюсь передать переменную из метода разрешения $routeProvider в контроллер, который будет использоваться для этого маршрута. но происходит то, что объект разрешается, но контроллер не ждет разрешения объекта. вот фрагмент кода, который я использую:

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: "/" });

поэтому отображается сообщение журнала с именем из инструкции app.js. в то время как контроллер вводит предположительно разрешенный продукт следующим образом:

(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;


    }
}());

в то время как сообщение журнала в контроллере отображается как неопределенное.

я использую угловой js 1.6.1.


person user1874288    schedule 09.05.2017    source источник


Ответы (1)


Контроллер не будет ждать, потому что разрешенный элемент — это обещание, возвращаемое $resource (я предполагаю, что вы используете $resource). Вы должны сделать что-то вроде этого:

var editCtrlViewModel = this;
product.$promise.then(function (element) {
    editCtrlViewModel.product = element;
    editCtrlViewModel.title = "Edit: " + element.Name;
})
person Radek Anuszewski    schedule 09.05.2017
comment
Спасибо, это работает. но я ожидал, что контроллер не будет инициализирован до тех пор, пока объект не будет разрешен первым, это было недавно обновлено ??? - person user1874288; 09.05.2017
comment
@user1874288 user1874288 Вы правы, но объект разрешается, что означает, что он вернул значение (return productsResource.getProductById()) и возвращает обещание, а обещание разрешается отдельно. Если вам нужно ввести, например, productId как return $route.current.params.id), это не промис и не требует дополнительного разрешения. - person Radek Anuszewski; 09.05.2017