3
respostas

Trabalhando com dois controllers numa mesma view

Olá, Como exercício, criei uma página com 2 elementos: um select e uma tabela, sendo que cada elemento é controlado por um controller específico:

<div class="row">
    <div class="well" ng-controller="competenciaCtrl">
        <form class="form-inline">
            <div class="form-group">
                <select class="form-control" ng-model="periodoEscolhido" ng-options="x.REF for x in vetor_anomes">
                    <option value="">Escolha um periodo</option>
                </select>
            </div>
            <button class="btn btn-default" type="button" ng-click="submeteAnoMes()">Submit</button>
        </form>
    </div> <!-- fim do bloco de competência -->
</div>

<div class="row">
    <div class="well tamanhoTabela" ng-controller="interfaceCtrl">
        <table class="table table-striped table-hover">
            <thead>
                <tr>
                    <th>#</th>
                    <th>INTERFACE</th>
                    <th>SITUAÇÃO</th>
                    <th>ÚLTIMA ALTERAÇÃO</th>
                </tr>
            </thead>

            <tbody>
                <tr ng-repeat="x in tbl_arquivos_recebidos">
                    <td>{{ $index+1 }}</td>
                    <td><a href="" ng-click="verCriticas(x.COD_SISTEMA)">{{ x.COD_SISTEMA + ' - ' + x.NOME_SISTEMA }}</a></td>
                    <td>{{ x.DESC_SITUACAO }}</td>
                    <td>{{ x.DT_HR }}</td>
                </tr>
            </tbody>
        </table>
    </div> <!-- fim do bloco tabela -->
</div>

Existe alguma forma de pegar o objeto selecionado (do primeiro controller) ser lido no outro controller?

// controller do select
angular.module("painelMonitoramento").controller("competenciaCtrl", function($scope, $http){ 

//  $scope.data_referencia = "201811";
//  $scope.vetor_anomes = ["201811","201810","201809","201808"];
    $scope.vetor_anomes = [];

    $scope.retornaVetorAnoMes = function(){ 
        $http.get('api/conexao.php/dataref').then( 
            function(response){ 
                $scope.vetor_anomes = response.data.dados; 
            }, 
            function(error){ 
                alert('Ocorreu algum erro durante o processamento da informação! Tente novamente.'); 
            } 
        ); 
    } 
    $scope.retornaVetorAnoMes(); 


    $scope.submeteAnoMes = function(){
        var item = $scope.periodoEscolhido;

        if (item != null) {
            console.log(item);
        }
    }

});
// controller da tabela
angular.module("painelMonitoramento").controller("interfaceCtrl", function($scope, $http){ 

    $scope.dataRef = "201811";
    $scope.detalhamento = [];

    $scope.retornaTabelaArquivosRecebidos = function(){ 
        $http.get('api/conexao.php/tabela/'+$scope.dataRef).then( 
            function(response){ 
                $scope.tbl_arquivos_recebidos = response.data.dados; 
            }, 
            function(error){ 
                alert('Ocorreu algum erro durante o processamento da informação! Tente novamente.'); 
            } 
        ); 
    } 
    $scope.retornaTabelaArquivosRecebidos(); 


    $scope.verCriticas = function(item){
        var dt = new Date();
        var str = dt.toLocaleDateString();
        var sdt = str.substr(6, 4) + "-" + str.substr(3, 2) + "-" + str.substr(0, 2);
        var cod = item;

        $scope.detalhamento.push(sdt); 
        $scope.detalhamento.push(cod); 

        console.log($scope.detalhamento);
    }
    $scope.verCriticas();
});

No controller1, criei a função retornaVetorAnoMes que carrega uma lista de períodos no formato AAAAMM, e o recebo na variável $scope.vetor_anomes.

No controller2, atribuo à variável $scope.dataRef um anomes, mas o ideal seria o $scope.vetor_anomes[0] do outro controller. Mas não funcionou.

Alguma sugestão?

3 respostas

Fala aí Sanderson, tudo bem? Antes de tentar ajudar gostaria de fazer uma pergunta: Porque está fazendo o curso de Angular 1? Está precisando para dar manutenção em projetos legados?

Pergunto isso porque o mesmo foi abandonado e descontinuado pela Google, na Alura temos um curso de 4 partes sobre o Angula 6:

https://cursos.alura.com.br/course/angular-fundamentos

Se não for por necessidade de projetos legados recomendo trancar esse e começar o novo.

Espero ter ajudado.

Oi Matheus

Respondendo tua pergunta, na empresa em que trabalho, o departamento de TI só homologou para uso o angular 1x. Nem o NodeJS, nem outras versões do angular estão homologadas para uso.

Além disso, atualmente só venho trabalhando com projetos desenvolvidos por terceiros, que precisam de modificação, e que são custosos para desenvolver do zero novamente!

Sanderson, tudo bem? Esse me parece um problema de escopos. Um controller não pode acessar o escopo do outro sem que eles tenham uma relação. Há algumas formas de resolver isso.

A primeira delas e não recomendada é colocar o dado que você quer compartilhar no Root Scope.

A segunda é criar um controller sobre os dois que pode agir como ponte. Então você pode fazer uso do emit pra enviar um valor de um controller pai e pegar o valor no filho ou fazer um broadcast do evento pra todos os controlles dentro do escopo do controller pai.

Tem mais sobre propagação do evento aqui: https://docs.angularjs.org/guide/scope#scope-events-propagation

A terceira solução seria criar um serviço, que ficaria parecido com a segunda solução. Então em um ponto você executa o serviço emitindo um valor e no outro você observa a propagação. Esse resultado pode ser feito também com bibliotecas do tipo PubSub.