Разрешение родительского состояния перед проверкой

0

У меня есть несколько состояний, созданных в моем угловом приложении, которые выглядят так:

.state('createOrder', {
    url: '/customer-services/orders/create?orderNumber',
    templateUrl: 'tpl/customerServices/orders/save.html',
    controller: 'SaveOrderController',
    controllerAs: 'controller',
    params: {
        accountNumber: null,
    },
    resolve: {

        // If we have an order number, we populate the new order
        order: ['$q', '$stateParams', 'OrderService', 'SaveOrderService', function ($q, $stateParams, service, shared) {

            // Get our order number
            var orderNumber = $stateParams.orderNumber;

            // Defer our promise
            var deferred = $q.defer();

            // If we have an order number
            if (orderNumber) {

                // Get our order from the system
                service.get(orderNumber).then(function (response) {

                    // Loop through the current lines
                    for (var i = 0; i < response.lines.length; i++) {

                        // Get the current line
                        var line = response.lines[i];

                        // Set to disabled
                        line.disabled = true;
                    }

                    // Assign our models
                    shared.order = response;

                    // Resolve our promise
                    deferred.resolve();
                });

            // If we don't have an order number
            } else {

                // Resolve our promise anyway
                deferred.resolve();
            }

            // Return our promise
            return deferred.promise;
        }],

        // Updates the account number in our order
        updateAccount: ['$stateParams', 'SaveOrderService', function ($stateParams, shared) {

            // Assigns the account number to the parameter if it has been passed
            shared.order.accountNumber = $stateParams.accountNumber;
        }]
    },
    data: {
        requireLogin: true,
        pageTitle: 'Add order'
    }
}).state('createOrder.lines', {
    url: '/lines',
    views: {
        '@': {
            templateUrl: 'tpl/customerServices/orders/save/lines.html',
            controller: 'SaveOrderLinesController',
            controllerAs: 'controller'
        }
    },
    params: {
        id: null
    },
    resolve: {
        validate: ['$state', '$stateParams', '$timeout', 'SaveOrderService', function ($state, $stateParams, $timeout, shared) {

            console.log(shared);

            // If we don't have an account number
            if (!shared.order.accountNumber) {

                // Timeout to avoid digest issues
                $timeout(function () {

                    // Redirect to the create order view
                    $state.go('createOrder', { orderNumber: $stateParams.orderNumber });
                });
            }
        }],

        // Genearates a default order line for selects an existing one for editing
        orderLine: ['$stateParams', 'ArrayService', 'SaveOrderService', function ($stateParams, arrayService, shared) {

            // Get our id
            var id = $stateParams.id;

            // If we have an id
            if (id) {

                // Get our index
                var index = arrayService.indexOf(shared.order.lines, { id: id }, 'id');

                // If our index is greater than -1
                if (index > -1) {

                    // Return the current line
                    return shared.order.lines[index];
                }
            }

            // Falback, return blank (ish) order line
            return {
                forDelivery: true,
                quantity: 1,
                unitOfMeasure: 0
            };
        }],

        // If we have an existing line, gets the product
        product: ['ProductService', 'SaveOrderService', 'orderLine', function (service, shared, orderLine) {

            // If we have a product
            if (orderLine.productCode) {

                // Return our product
                return service.get(orderLine.productCode, shared.order.accountNumber);
            }

            // Fallback, return nothing
            return null;
        }]
    },
    data: {
        requireLogin: true,
        pageTitle: 'Add order : Lines'
    }
})

Я бы хотел, чтобы решение моего " заказа " разрешилось до того, как будут разрешены какие-либо разрешения в дочернем состоянии (createOrder.lines). Я думал, что использование обещания сделает это, но моя проверка не сработает, если я пойду прямо в представление линий при поставке номера заказа.

Кто-нибудь знает, как я могу получить заказ для разрешения до того, как будет проверена правильность строк?

  • 0
    Я не вижу, где ваш код состояния ребенка ожидает разрешения обещания в родительском. Разве у вас не должно быть $ q.all () или чего-то еще, ожидающего, пока все зависимости дочернего кода проверки не будут готовы?
  • 0
    потому что orderNumber не является обязательным, я должен создать обещание. Таким образом (теоретически) обещание - это то, что возвращается, и представление не будет показано, пока обещание не будет отклонено или разрешено. В моем случае, если у нас есть номер заказа, обещание не будет выполнено, пока не будет выполнено обещание обслуживания. Если номер заказа отсутствует, обещание будет выполнено немедленно. Мне не нужен $ q.all (), потому что я не цепочка.
Показать ещё 1 комментарий
Теги:
angular-ui-router

1 ответ

0
Лучший ответ

Это то, что я нашел в документах ui-router для унаследованных разрешенных зависимостей...

Ключи разрешения ДОЛЖНЫ быть введены в дочерние состояния, если вы хотите дождаться, пока обещания будут разрешены до создания экземпляров.

https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views#inherited-resolved-dependencies

  • 0
    Я думал, что это может быть так, стыдно, потому что мне не нужно ничего делать с решимостью в детском состоянии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню