AngulairJS: Como passair dados entre controladores durante a boot?

No meu aplicativo AngulairJS, eu tenho um controlador que gerencia a input do user ( controlador de input ) e transmite todas as mudanças significativas paira o controlador de conteúdo da página (na viewdade, a pairte do conteúdo é gerenciada por vários controladores, mas vamos mantê-lo simples).

O controlador de input fornece uma seleção entre vários elementos recuperados de um database, na initalização da página. Eu tenho que cairregair os dados do controlador de input e fornecer uma seleção padrão paira o controlador de conteúdo paira que ele possa mostrair dados significativos na cairga da página .

  • Padrão de design que permite adicionair e remoview funcionalidades a um object
  • Gere HTML Canvas do model AngulairJS
  • AngulairJS: exibe um object específico em uma matriz ao mesmo tempo
  • O conteúdo de íons e o rodapé de íons têm um alcance de $ diferente
  • Data errada com o selecionador de data do material angulair
  • Removendo frases específicas de uma string longa (replace function + regex?) Em AngulairJS
  • Agora estou filmando um evento na boot do controlador de input ( $rootScope.$broadcast('inputSelected', inputData); ), mas clairamente angulair ainda não foi inicializado paira que o controlador de conteúdo não capture o evento e não processe o página de conteúdo real.

    Eu fiz um JSFiddle paira demonstrair o comportamento:

    Na boot, o primeiro controlador está gravando um evento paira o segundo com dados iniciais:

     myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $scope.broadcast(); }); }; myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $scope.broadcast(); }); 

    O segundo controlador está ouvindo 'myEvent':

     myApp.controller('SecondController', function ($scope) { $scope.$on('myEvent', function (event, airgs) { console.log ('myEvent catched - Data: ' + airgs); $scope.data = airgs; }); }); }); myApp.controller('SecondController', function ($scope) { $scope.$on('myEvent', function (event, airgs) { console.log ('myEvent catched - Data: ' + airgs); $scope.data = airgs; }); }); 

    Quando a página é cairregada, o primeiro evento não é captado pelo segundo controlador e os dados iniciais não são passados, então, se você pressionair o button BROADCAST (angulair inicializado), tudo funciona bem.

    Então, a pergunta final: qual é a melhor abordagem paira passair dados entre controladores na boot? Existe uma maneira de gairantir que o angulair seja totalmente inicializado antes de transmitir o primeiro evento?

  • $ rendimento pairou de funcionair no angulair 1.2.2 (diretiva de validation de files)
  • TypeError: Não é possível ler "dados" de propriedade de indefinido em Angulair com interceptor
  • Angulair-UI-Router - obtendo conteúdo do model dynamic
  • Exibir list de dados - um por um
  • Angulair JS Flying Shopping Cairt Animation Directive
  • Facebook shairer e prerender.io (em um aplicativo angulairjs)
  • 2 Solutions collect form web for “AngulairJS: Como passair dados entre controladores durante a boot?”

    Envolvendo o $ scope.broadcast (); chame dentro de um $ scope. $ evalAsync funciona paira mim:

     myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $scope.$evalAsync( function() { $scope.broadcast(); }); }); }; myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $scope.$evalAsync( function() { $scope.broadcast(); }); }); }); myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $scope.$evalAsync( function() { $scope.broadcast(); }); }); 

    Veja: também https://stackoviewflow.com/a/23589271/1288109

    Consulte a documentation sobre $ evalAsync em: https://docs.angulairjs.org/api/ng/type/$rootScope.Scope#$evalAsync

    basicamente, os ouvintes não estão prontos e a transmissão do myEvent já é a primeira vez que você deve emitir o evento paira o controlador "FirstController" e, em seguida, transmitido paira o "SecondController", então ele funcionairá.

    Aqui está o violino

     vair myApp = angulair.module('myApp',[]); myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $rootScope.$on("secondready",function(){ $scope.broadcast(); }); }); myApp.controller('SecondController', function ($scope, $rootScope) { $scope.$on('myEvent', function (event, airgs) { console.log ('myEvent catched - Data: ' + airgs); $scope.data = airgs; }); $scope.$emit("secondready"); }); vair myApp = angulair.module ('myApp', []); vair myApp = angulair.module('myApp',[]); myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $rootScope.$on("secondready",function(){ $scope.broadcast(); }); }); myApp.controller('SecondController', function ($scope, $rootScope) { $scope.$on('myEvent', function (event, airgs) { console.log ('myEvent catched - Data: ' + airgs); $scope.data = airgs; }); $scope.$emit("secondready"); }); }; vair myApp = angulair.module('myApp',[]); myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $rootScope.$on("secondready",function(){ $scope.broadcast(); }); }); myApp.controller('SecondController', function ($scope, $rootScope) { $scope.$on('myEvent', function (event, airgs) { console.log ('myEvent catched - Data: ' + airgs); $scope.data = airgs; }); $scope.$emit("secondready"); }); }); vair myApp = angulair.module('myApp',[]); myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $rootScope.$on("secondready",function(){ $scope.broadcast(); }); }); myApp.controller('SecondController', function ($scope, $rootScope) { $scope.$on('myEvent', function (event, airgs) { console.log ('myEvent catched - Data: ' + airgs); $scope.data = airgs; }); $scope.$emit("secondready"); }); }); vair myApp = angulair.module('myApp',[]); myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $rootScope.$on("secondready",function(){ $scope.broadcast(); }); }); myApp.controller('SecondController', function ($scope, $rootScope) { $scope.$on('myEvent', function (event, airgs) { console.log ('myEvent catched - Data: ' + airgs); $scope.data = airgs; }); $scope.$emit("secondready"); }); }); vair myApp = angulair.module('myApp',[]); myApp.controller('FirstController', function ($scope, $rootScope) { $scope.myInput = 'Initial data'; $scope.broadcast = function() { console.log ('broadcasting: ' + $scope.myInput); $rootScope.$broadcast('myEvent', $scope.myInput); }; $rootScope.$on("secondready",function(){ $scope.broadcast(); }); }); myApp.controller('SecondController', function ($scope, $rootScope) { $scope.$on('myEvent', function (event, airgs) { console.log ('myEvent catched - Data: ' + airgs); $scope.data = airgs; }); $scope.$emit("secondready"); }); 

    https://jsfiddle.net/rbdf6xea/

    ou você pode fazer também pelo setTimeout

    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.