Ao carregar um modo de exibição, gostaria de executar algum código de inicialização em seu controlador associado.
Para fazer isso, usei a diretiva ng-init no elemento principal da minha visão:
<div ng-init="init()">
blah
</div>
e no controlador:
$scope.init = function () {
if ($routeParams.Id) {
//get an existing object
});
} else {
//create a new object
}
$scope.isSaving = false;
}
Primeira pergunta: essa é a maneira certa de fazer isso?
Em seguida, tenho um problema com a sequência de eventos ocorrendo. Na visualização, tenho um botão 'salvar', que usa a ng-disabled
diretiva como tal:
<button ng-click="save()" ng-disabled="isClean()">Save</button>
a isClean()
função é definida no controlador:
$scope.isClean = function () {
return $scope.hasChanges() && !$scope.isSaving;
}
Como você pode ver, ele usa o $scope.isSaving
sinalizador, que foi inicializado na init()
função.
PROBLEMA: quando a visualização é carregada, a função isClean é chamada antes da init()
função, portanto, o sinalizador isSaving
é undefined
. O que posso fazer para evitar isso?
Desde AngularJS 1.5, devemos usar o
$onInit
que está disponível em qualquer componente AngularJS. Retirado da documentação do ciclo de vida do componente desde a v1.5, é a forma preferida:>> Fiddle Demo
Um exemplo avançado de uso do ciclo de vida do componente:
O ciclo de vida do componente nos dá a capacidade de lidar com os componentes de uma boa maneira. Ele nos permite criar eventos para, por exemplo, "init", "change" ou "destroy" de um componente. Dessa forma, somos capazes de gerenciar coisas que dependem do ciclo de vida de um componente. Este pequeno exemplo mostra como registrar e cancelar o registro de um
$rootScope
ouvinte de evento$on
. Sabendo que um evento$on
ligado$rootScope
não será desfeito quando o controlador perder sua referência na visão ou for destruído, precisamos destruir um$rootScope.$on
ouvinte manualmente. Um bom lugar para colocar essas coisas é a$onDestroy
função de ciclo de vida de um componente:>> Demonstração de violino
fonte
Ou você pode apenas inicializar em linha no controlador. Se você usar uma função init interna ao controlador, ela não precisa ser definida no escopo. Na verdade, pode ser autoexecutável:
fonte
Eu uso o seguinte modelo em meus projetos:
fonte