AngularJS: Могу ли я прикрепить обратный вызов к методу запуска модуля?

Проблема высокого уровня:

  • Я хотел бы знать, вошел ли текущий пользователь в Google Plus.

Частичное решение:

Сложность:

Конкретная проблема:

  • Я хотел бы прикрепить метод обратного вызова к параметру onload, но асинхронная выборка JavaScript из https://apis.google.com/js/client.js происходит внутри метода запуска AngularJS.

-> Инициализация модуля:

.run([function() {  
  var po = document.createElement('script');  
  po.type = 'text/javascript';  
  po.async = true;  
  po.src = 'https://apis.google.com/js/client.js';  
  var s = document.getElementsByTagName('script')[0];  
  s.parentNode.insertBefore(po, s);  
}]);

Хотя Google рекомендует получать https://apis.google.com/js/client.js асинхронно, я к этому не привязан. Но я хотел бы сохранить большую часть этого кода интеграции Google+ либо внутри поставщика AngularJS, либо в службе AngularJS.

Любая помощь будет оценена по достоинству.


person Jim G.    schedule 28.04.2015    source источник
comment
внедрите провайдера в run и выполните обещание $q в обратном вызове Google, который возвращает один из методов вашего провайдера.   -  person charlietfl    schedule 28.04.2015
comment
@charlietfl: Похоже, вы что-то задумали, но я не совсем понимаю код, который вы прописываете. Я надеюсь, что либо вы, либо кто-то еще может уточнить.   -  person Jim G.    schedule 28.04.2015
comment
Я не понимаю вопроса. Почему проблема в том, что выборка https://apis.google.com/js/client.js находится внутри метода запуска AngularJS?   -  person user3338098    schedule 28.10.2015


Ответы (1)


Я не вижу ничего плохого в использовании метода onload.

.run(['$rootScope', function($rootScope) {  
    var po = document.createElement('script');  
    po.type = 'text/javascript';  
    po.async = true;  
    po.src = 'https://apis.google.com/js/client.js';  
    po.onload = function(){
        //it's loaded. Inject a service in your run and you can do stuff here
        $rootScope.$apply(); //assuming your callback needs to do something within angular
    };
    var s = document.getElementsByTagName('script')[0];  
    s.parentNode.insertBefore(po, s);
}]);
person Mathew Berg    schedule 28.04.2015
comment
На самом деле я хотел бы вызывать методы внутри одного и того же модуля. Как я могу получить к ним доступ? Кажется, не имеет смысла внедрять тот же сервис, прикрепленный к методу run. - person Jim G.; 28.04.2015
comment
onload не вариант, потому что даже если скрипт загружен, это не означает, что Google завершил настройку необходимых объектов глобальных переменных, поэтому мы требуем, чтобы Google сообщил нам, когда это будет сделано... - person user3338098; 29.04.2015
comment
поэтому вместо function signinCallback() {$rootScope.$apply();} - person user3338098; 28.10.2015