Existem dois padrões em uso para acessar as funções do controlador: this
e $scope
.
Qual devo usar e quando? Eu entendo this
é definido como o controlador e $scope
é um objeto na cadeia de escopo de visualizações. Mas com a nova sintaxe "Controller as Var", você também pode usar facilmente. Então, o que estou perguntando é o que é melhor e qual é a direção para o futuro?
Exemplo:
Usando
this
function UserCtrl() { this.bye = function() { alert('....'); }; }
<body ng-controller='UserCtrl as uCtrl'> <button ng-click='uCtrl.bye()'>bye</button>
Usando
$scope
function UserCtrl($scope) { $scope.bye = function () { alert('....'); }; }
<body ng-controller='UserCtrl'> <button ng-click='bye()'>bye</button>
Pessoalmente, acho this.name
que é mais fácil para os olhos e mais natural em comparação com outros padrões de Javascript OO.
Conselho por favor?
Respostas:
Ambos têm seus usos. Primeiro, um pouco de história ...
$ scope é a técnica "clássica", enquanto "controller as" é muito mais recente (a partir da versão 1.2.0 oficialmente, embora ela tenha aparecido em pré-lançamentos instáveis anteriores a isso).
Ambos funcionam perfeitamente bem e a única resposta errada é misturá-los no mesmo aplicativo sem uma razão explícita. Francamente, misturá-los funcionará, mas isso apenas aumentará a confusão. Então escolha um e role com ele. O mais importante é ser consistente.
Qual? Isso depende de você. Existem muitos outros exemplos no escopo $, mas "controller as" também está ganhando força. Um é melhor que o outro? Isso é discutível. Então como você escolhe?
Conforto
Prefiro o "controller as" porque gosto de ocultar o escopo $ e expor os membros do controller à visualização por meio de um objeto intermediário. Ao definir isso. *, Posso expor exatamente o que quero expor do controlador para a exibição. Você também pode fazer isso com $ scope, apenas prefiro usar JavaScript padrão para isso. Na verdade, eu codifico assim:
Isso me parece mais limpo e facilita ver o que está sendo exposto à vista. Observe que eu nomeio a variável que retorno "vm", que significa viewmodel. Essa é apenas a minha convenção.
Com $ scope eu posso fazer as mesmas coisas, então não estou adicionando ou prejudicando a técnica.
Então cabe a você lá.
Injeção
Com $ scope, eu preciso injetar $ scope no controlador. Não preciso fazer isso com o controlador, a menos que precise por algum outro motivo (como $ broadcast ou relógios, embora tente evitar relógios no controlador).
ATUALIZAÇÃO Escrevi este post sobre as 2 opções: http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/
fonte
var vm = this;
você também precisa chamá-lo de 'vm'? 'controlador como vm'. Eles têm que ser iguais?$scope
está sendo removido no Angular 2.0. Portanto, usarthis
seria uma abordagem que outros desejam seguir à medida que a data de lançamento do Angular 2.0 se aproxima.fonte
Minha opinião é que 'this' em javascript tem problemas suficientes por si só, e que adicionar outro significado / uso não é uma boa ideia.
Eu usaria $ scope, por uma questão de clareza.
ATUALIZAR
Agora existe a sintaxe 'controller as', discutida aqui . Não sou fã, mas agora que é uma construção AngularJS mais 'oficial', ela merece alguma atenção.
fonte
Eu acho que o Controller As é melhor, pois permite aninhar escopos mais facilmente, conforme descrito por Todd Motto aqui:
http://toddmotto.com/digging-into-angulars-controller-as-syntax/
Além disso, garantirá que você sempre tenha pelo menos um. na sua expressão de ligação, que força você a seguir a recomendação não vincular às primitivas .
Além disso, você pode se separar do escopo que está desaparecendo no 2.0.
fonte
A documentação angular informa explicitamente que o uso
this
é recomendado. Isso, além do fato de$scope
estar sendo removido, é motivo suficiente para eu nunca usar$scope
.fonte
"O escopo $ de jason328 está sendo removido no Angular 2.0" parece um bom motivo para mim. E encontrei outro motivo para me ajudar a fazer a escolha:
this
é mais legível - quando vejofooCtrl.bar
em HTML, imediatamente sei onde encontrar a definição debar
.Atualizações: pouco tempo depois de mudar para a
this
solução, comecei a perder o$scope
caminho que precisa de menos digitaçãofonte
Eu prefiro uma combinação.
Um console.log simples de $ scope e 'this' depois de preenchê-los com alguns dados simulados mostrarão isso.
$ scope permite o acesso às partes inferiores de um controlador, por exemplo:
** Propriedades e métodos com $$ não são recomendados para a equipe Angular, mas o $ pode ser um jogo seguro para fazer coisas legais com $ parent e $ id.
'this' vai direto ao ponto, anexando dados e funções com duas direções. Você verá apenas o que anexou:
Então, por que prefiro uma combinação?
Nos aplicativos aninhados do ui-router, eu posso acessar o controlador principal, definir e chamar valores e funções universais dentro de um controlador filho:
No controlador principal:
No controlador infantil:
Agora, você pode acessar o pai de dentro do filho e o filho do pai!
fonte
Ambos funcionam, mas se você aplicar coisas apropriadas para o escopo em $ scope, e se você aplicar coisas apropriadas para o controlador no controlador, seu código será fácil de manter. Para as pessoas que dizem "Ugh, use apenas o escopo, esqueça este controlador como sintaxe" ... Pode funcionar da mesma forma, mas eu me pergunto como você conseguirá manter um aplicativo enorme sem perder o controle das coisas.
fonte