Eu li sobre a nova sintaxe do angularJS sobrecontroller as xxx
A sintaxe
InvoiceController as invoice
diz ao Angular para instanciar o controlador e salvá-lo na fatura variável no escopo atual.
Visualização:
Ok, então não terei o parâmetro $scope
no meu controlador e o código será muito mais limpo no controlador.
Mas
Vou ter que especificar outro alias na view
Então até agora eu poderia fazer:
<input type="number" ng-model="qty" />
....controller('InvoiceController', function($scope) {
// do something with $scope.qty <--notice
E agora eu posso fazer:
<input type="number" ng-model="invoic.qty" /> <-- notice
....controller('InvoiceController', function() {
// do something with this.qty <--notice
Questão
Qual é o objetivo de fazer isso? remover de um lugar e adicionar a outro lugar?
Ficarei feliz em ver o que estou perdendo.
javascript
angularjs
Royi Namir
fonte
fonte
controller as
corrigi-lo).Respostas:
Existem várias coisas sobre isso.
Algumas pessoas não gostam da
$scope
sintaxe (não me pergunte por que). Eles dizem que eles poderiam simplesmente usarthis
. Esse era um dos objetivos.Deixar claro de onde vem uma propriedade também é realmente útil.
Você pode aninhar controladores e, ao ler o html, fica bem claro onde todas as propriedades vêm.
Você também pode evitar alguns dos problemas da regra de pontos .
Por exemplo, tendo dois controladores, ambos com o mesmo nome 'nome', você pode fazer isso:
Você pode modificar pai e filho, sem problemas. Mas você precisa usar
$parent
para ver o nome do pai, porque o sombreava no controlador filho. No código html maciço$parent
pode ser problemático, você não sabe de onde vem esse nome.Com
controller as
você pode fazer:Mesmo exemplo, mas é muito mais claro de ler.
$scope
plunkercontroller as
plunkerfonte
foo() { ... }
é muito mais limpo que$scope.foo = function() { ... }
.A principal vantagem da
controller as
sintaxe que vejo é que você pode trabalhar com controladores como classes, não apenas algumas funções de decoração de escopo $ e tirar proveito da herança. Geralmente, encontro uma situação em que há uma funcionalidade muito semelhante a vários controladores, e a coisa mais óbvia a se fazer é criar umaBaseController
classe e herdá-la.Embora exista uma herança $ scope, que resolve parcialmente esse problema, algumas pessoas preferem escrever código de uma maneira mais OOP, o que, na minha opinião, facilita o raciocínio e o teste do código.
Aqui está um violino para demonstrar: http://jsfiddle.net/HB7LU/5796/
fonte
Acredito que uma vantagem específica seja clara quando você tiver escopos aninhados. Agora ficará completamente claro exatamente de que escopo uma referência de propriedade vem.
fonte
Fonte
Diferença entre Criando um Controlador Usando o
$scope object
e Usando a“controller as”
Sintaxe e VMCriando um controlador usando o objeto $ scope
Geralmente, criamos um controlador usando o objeto $ scope, como mostra a listagem abaixo:
Acima, estamos criando o AddController com três variáveis e um comportamento, usando o controlador de objeto $ scope e a exibição, que se comunicam. O objeto $ scope é usado para passar dados e comportamento para a exibição. Cola a vista e o controlador juntos.
Essencialmente, o objeto $ scope executa as seguintes tarefas:
Passar dados do controlador para a visualização
Passar o comportamento do controlador para a visualização
Cola o controlador e vê juntos
O objeto $ scope é modificado quando uma exibição é alterada e uma exibição é modificada quando as propriedades do objeto $ scope são alteradas
Anexamos propriedades a um objeto $ scope para transmitir dados e comportamento à exibição. Antes de usar o objeto $ scope no controlador, precisamos passá-lo na função do controlador como dependências.
Usando a sintaxe "controller as" e vm
Podemos reescrever o controlador acima usando o controlador como sintaxe e a variável vm como mostrado na listagem abaixo:
Essencialmente, estamos atribuindo isso a uma variável vm e, em seguida, anexando uma propriedade e um comportamento a isso. Na visualização, podemos acessar o AddVmController usando o controlador como sintaxe. Isso é mostrado na lista abaixo:
É claro que podemos usar outro nome que não “vm” no controlador como sintaxe. Sob o capô, o AngularJS cria o objeto $ scope e anexa as propriedades e o comportamento. No entanto, usando o controlador como sintaxe, o código é muito limpo no controlador e apenas o nome alternativo é visível na exibição.
Aqui estão algumas etapas para usar o controlador como sintaxe:
Crie um controlador sem o objeto $ scope.
Atribua isso a uma variável local. Eu preferi o nome da variável como vm, você pode escolher qualquer nome de sua escolha.
Anexe dados e comportamento à variável vm.
Na exibição, forneça um alias ao controlador usando o controlador como sintaxe.
Você pode atribuir qualquer nome ao alias. Prefiro usar vm, a menos que não esteja trabalhando com controladores aninhados.
Ao criar o controlador, não há vantagens diretas ou desvantagens de usar a abordagem de objeto $ scope ou o controlador como sintaxe. É apenas uma questão de escolha, no entanto, usar o controlador como sintaxe torna o código JavaScript do controlador mais legível e evita problemas relacionados a esse contexto.
Controladores aninhados na abordagem de objeto $ scope
Temos dois controladores, conforme mostrado na lista abaixo:
A propriedade "age" está dentro de ambos os controladores e, na exibição, esses dois controladores podem ser aninhados conforme mostrado na listagem abaixo:
Como você vê, para acessar a propriedade age do controlador pai, estamos usando o $ parent.age. A separação de contexto não é muito clara aqui. Mas, usando o controlador como sintaxe, podemos trabalhar com controladores aninhados de uma maneira mais elegante. Digamos que temos controladores, conforme mostrado na listagem abaixo:
Na exibição, esses dois controladores podem ser aninhados, conforme mostrado na listagem abaixo:
No controlador como sintaxe, temos um código mais legível e a propriedade pai pode ser acessada usando o nome alternativo do controlador pai em vez de usar a sintaxe $ parent.
Concluirei este post dizendo que é puramente sua escolha se você deseja usar o controlador como sintaxe ou o objeto $ scope. Também não há grande vantagem ou desvantagem, simplesmente que o controlador como sintaxe que você controla no contexto é um pouco mais fácil de trabalhar, dada a clara separação nos controladores aninhados na exibição.
fonte
Acho que a principal vantagem é uma API mais intuitiva, pois os métodos / propriedades estão associados diretamente à instância do controlador e não ao objeto do escopo. Basicamente, com a abordagem antiga, o controlador se torna apenas uma decoração para a construção do objeto de escopo.
Aqui estão mais algumas informações sobre isso: http://www.syntaxsuccess.com/viewarticle/551798f20c5f3f3c0ffcc9ff
fonte
Pelo que li, $ scope será removido no Angular 2.0, ou pelo menos como vemos o uso de $ scope. Pode ser bom começar a usar o controlador assim que o lançamento do 2.0 se aproxima.
Link de vídeo aqui para mais discussões sobre o assunto.
fonte