2013-09-04 1 views
0

Итак ... Я пытаюсь узнать некоторые угловые вещи, а затем я достиг точки, где я застрял. В моем приложении я использую сторонние API, поэтому я не могу положиться на $http, поэтому в коде вы увидите $apply.

Так, в принципе у меня есть это:

.when('/dashboard',{ 
    controller : 'DashboardController', 
    templateUrl : 'ui/modules/dashboard/dashboard.html', 
    resolve : { 
    data : function(myService){ 
     return myService.start(); 
    } 
    } 
}) 

До сих пор ничего действительно странно. У этого метода есть обещание, верно? Функция запуска следующая:

var start = function(){ 
    return initializeConnection().then(function(){ 
    return login(false); 
    }); 
}; 

Итак, в принципе, если все работает, все работает. Замечательно. Дело в том, что если я получу обетование от второй функции (это login), я не могу уловить ошибку в этом, это мой AppController, который создается поверх приложения (так оно всегда создается):

$rootScope.$on("$routeChangeError", function (event, previous, current, rejection) { 
    console.log('Failing'); 
}); 

Это в основном никогда не называлось. Решение, с которым я пытался это сделать, заключается в том, чтобы вернуть обещание от функции start, а затем, если какая-либо из этих асинхронных функций завершится неудачно, не получится обещанное обещание. Но, как я вижу, это должно быть ненужным.

Можете ли вы указать мне правильное направление?

ответ

0

В вашем коде, если вы получаете отказ от обещаний, DashboardController никогда не создается, и ваше представление никогда не загружается - так что вы не можете там ничего сделать. У вас должен быть контроллер, который будет создан, даже если ваше обещание будет отклонено.

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

var myApp = angular.module('myApp', []); 

myApp.config(function($routeProvider){ 
    $routeProvider 
    .when('/dashboard',{ 
     controller : 'DashboardController', 
     templateUrl : 'ui/modules/dashboard/dashboard.html', 
     resolve : { 
     data : function(myService){ 
      return myService.start(); 
     } 
     } 
    }) 
}); 


myApp.controller('checkConnection', function ($rootScope){ 
    $rootScope.$on("$routeChangeError", function (event, previous, current, rejection) { 
     console.log('Failing'); 
    }); 
}); 

myApp.controller('DashboardController', function($rootScope) { 
    // code for your controller goes here 
}); 

И в вашем index.html вы будете иметь:

<div ng-app="myApp" ng-controller="checkConnection"> 
    <ng-view></ng-view> 
</div> 

Контроллер checkConnection собирается быть реализован в любом случае - так что вы можете рассчитывать на то, чтобы обработать ошибку.

Если ошибка не возникает, то конкретный контроллер (например: DashboardController) для маршрута, к которому вы обращаетесь, будет выполняться нормально, и ваше представление будет загружено.

Есть места для улучшений, но я думаю, что это может сработать для вас.

Надеюсь, что это поможет или, по крайней мере, направить вас в правильном направлении.

+0

Привет, я забыл упомянуть об этом ... У меня уже есть этот код в AppController. Вопрос о обновлении –

+0

Привет Антонио, я исследовал его дальше и попытался воспроизвести проблему, с которой вы столкнулись. Пожалуйста, взгляните на это [ссылка] (http://stackoverflow.com/a/18661324/1310945). Он имеет 2 вложенных обещания, и если какое-либо из этих обещаний не удается, контроллеры все еще обрабатывают его. –

 Смежные вопросы

  • Нет связанных вопросов^_^