2013-07-02 3 views
0

С ui-router Я создал состояние, которое имеет одно из его видов, отображающее текущий статус пользователя. Следующий код получает текущий статус пользователя:Инициируйте контроллер, который зависит от разгруженной зависимости

var sydney = sydney || {}; 
sydney.checkAuth = function() { 
    gapi.auth.authorize({ 
     client_id : sydney.CLIENT_ID, 
     scope : sydney.SCOPES, 
     immediate : true 
    }, sydney.handleAuthResult); 
} 

sydney.handleAuthResult = function(authResult) { 
    if (authResult) { 
     // The user has authorized access 
     console.log("User is signed in"); 
    } else { 
     // User has not Authenticated and Authorized 
     console.log("User is not signed in"); 
    } 
} 

В state определяется как:

$stateProvider 
.state('route1', { 
    url: "/route1", 
    views : { 
     "headerView" : { 
      templateUrl : 'partials/header.html', 
      controller: 'LoginController' 
     }, 
     "navigationView" : { 
      templateUrl : 'partials/navigation.html', 
      controller: 'NavigationController' 
     }, 
     "contentView": { 
      templateUrl : 'partials/content1.html' 
     } 
    } 
}) 

LoginController:

function LoginController($scope, $state) { 
    $scope.checkUserStatus = function() { 
     sydney.checkAuth(); 
    } 
} 

мне нужно склеить все эти части, так что, когда Отображается headerView, я могу отображать состояние пользователя (вход в систему или нет).

Первое, что я сделал это, чтобы создать переменную в LoginController держать статус-

$scope.userStatus = sydney.checkAuth(); 

Вопрос заключается в том, что sydney.checkAuth имеет зависимость от Google APIs Client Library for JavaScript, который не загружен в тот момент, когда LoginController является создано. Таким образом, я получаю gapi is not defined, что имеет смысл.

Другим решением является инициализация $scope.userStatus после загрузки gapi (в обратном вызове). Но как вы скажете контроллеру обновить $scope.userStatus?

ответ

0

Существует несколько различных подходов к решению этой проблемы.

В подобной ситуации я имел успех инъекционного $rootScope с помощью $broadcast отправки события от зависимости, т.е. gapiSetup - это может затем быть подобран в соответствии с требованиями в контроллерах, услуги и т.д.

В частности, с помощью $broadcast отделяет компоненты, а также позволяет использовать это событие в нескольких местах - например, если вам нужно обновить другие места, а не только ваш заголовок.

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