Yo leí acerca de la nueva sintaxis de AngularJS respectocontroller as xxx
La sintaxis
InvoiceController as invoice
le dice a Angular que cree una instancia del controlador y lo guarde en la factura variable en el alcance actual.
Visualización:
Ok, entonces no tendré el parámetro $scope
en mi controlador y el código será mucho más limpio en el controlador.
Pero
Tendré que especificar otro alias en la vista
Entonces hasta ahora podría hacer:
<input type="number" ng-model="qty" />
....controller('InvoiceController', function($scope) {
// do something with $scope.qty <--notice
Y ahora puedo hacer:
<input type="number" ng-model="invoic.qty" /> <-- notice
....controller('InvoiceController', function() {
// do something with this.qty <--notice
Pregunta
¿Cuál es el objetivo de hacerlo? eliminar de un lugar y agregar a otro lugar?
Estaré encantado de ver qué me estoy perdiendo.
javascript
angularjs
Royi Namir
fuente
fuente
controller as
arregla).Respuestas:
Hay varias cosas al respecto.
A algunas personas no les gusta la
$scope
sintaxis (no me pregunten por qué). Dicen que simplemente podrían usarthis
. Ese era uno de los objetivos.Dejar en claro de dónde proviene una propiedad también es realmente útil.
Puede anidar controladores y al leer el html queda bastante claro de dónde proviene cada propiedad.
También puede evitar algunos de los problemas de la regla de puntos .
Por ejemplo, al tener dos controladores, ambos con el mismo nombre 'nombre', puede hacer esto:
Puede modificar tanto padre como hijo, no hay problema al respecto. Pero debe usar
$parent
para ver el nombre del padre, porque lo sombreó en el controlador secundario. En código html masivo$parent
podría ser problemático, no sabes de dónde viene ese nombre.Con
controller as
usted puede hacer:El mismo ejemplo, pero es mucho más claro de leer.
$scope
saqueadorcontroller as
saqueadorfuente
foo() { ... }
es más limpio que el camino$scope.foo = function() { ... }
.La principal ventaja con la
controller as
sintaxis que veo es que puede trabajar con controladores como clases, no solo con algunas funciones de decodificación de $ scope, y aprovechar la herencia. A menudo me encuentro con una situación en la que hay una funcionalidad que es muy similar a una serie de controladores, y lo más obvio es crear unaBaseController
clase y heredarla.A pesar de que existe una herencia $ alcance, que resuelve parcialmente este problema, algunas personas prefieren escribir código de una manera más orientada a objetos, lo que, en mi opinión, hace que el código sea más fácil de razonar y probar.
Aquí hay un violín para demostrar: http://jsfiddle.net/HB7LU/5796/
fuente
Creo que una ventaja particular es clara cuando tiene ámbitos anidados. Ahora quedará completamente claro exactamente de qué alcance proviene una referencia de propiedad.
fuente
Fuente
Diferencia entre crear un controlador usando
$scope object
y usar la“controller as”
sintaxis y vmCrear un controlador usando el objeto $ scope
Por lo general, creamos un controlador utilizando el objeto $ scope como se muestra en la lista a continuación:
Arriba estamos creando el AddController con tres variables y un comportamiento, usando el controlador y la vista de objeto $ scope, que se comunican entre sí. El objeto $ scope se usa para pasar datos y comportamiento a la vista. Pega la vista y el controlador juntos.
Esencialmente, el objeto $ scope realiza las siguientes tareas:
Pase datos del controlador a la vista
Pase el comportamiento del controlador a la vista
Pega el controlador y visualiza juntos
El objeto $ scope se modifica cuando cambia una vista y una vista se modifica cuando cambian las propiedades del objeto $ scope
Adjuntamos propiedades a un objeto $ scope para pasar datos y comportamiento a la vista. Antes de usar el objeto $ scope en el controlador, necesitamos pasarlo en la función del controlador como dependencias.
Uso de la sintaxis "controlador como" y vm
Podemos reescribir el controlador anterior usando el controlador como sintaxis y la variable vm como se muestra en la lista a continuación:
Esencialmente, estamos asignando esto a una variable vm y luego adjuntamos una propiedad y comportamiento a eso. En la vista podemos acceder al AddVmController usando el controlador como sintaxis. Esto se muestra en el listado a continuación:
Por supuesto, podemos usar otro nombre que "vm" en el controlador como sintaxis. Bajo el capó, AngularJS crea el objeto $ scope y adjunta las propiedades y el comportamiento. Sin embargo, al usar el controlador como sintaxis, el código es muy limpio en el controlador y solo el nombre del alias es visible en la vista.
Estos son algunos pasos para usar el controlador como sintaxis:
Cree un controlador sin objeto $ scope.
Asigne esto a una variable local. Preferí el nombre de la variable como vm, puede elegir el nombre que prefiera.
Adjunte datos y comportamiento a la variable vm.
En la vista, asigne un alias al controlador utilizando el controlador como sintaxis.
Puede dar cualquier nombre al alias. Prefiero usar VM a menos que no esté trabajando con controladores anidados.
Al crear el controlador, no hay ventajas o desventajas directas de utilizar el enfoque de objeto $ scope o el controlador como sintaxis. Sin embargo, es puramente una elección, usar el controlador como sintaxis hace que el código JavaScript del controlador sea más legible y evita cualquier problema relacionado con este contexto.
Controladores anidados en el enfoque de objeto $ scope
Tenemos dos controladores como se muestra en el listado a continuación:
La propiedad "edad" está dentro de ambos controladores, y en la vista estos dos controladores se pueden anidar como se muestra en la siguiente lista:
Como puede ver, para acceder a la propiedad de edad del controlador principal estamos usando $ parent.age. La separación del contexto no está muy clara aquí. Pero usando el controlador como sintaxis, podemos trabajar con controladores anidados de una manera más elegante. Digamos que tenemos controladores como se muestra en la lista a continuación:
En la vista, estos dos controladores se pueden anidar como se muestra en la lista a continuación:
En el controlador como sintaxis, tenemos un código más legible y se puede acceder a la propiedad principal utilizando el nombre de alias del controlador principal en lugar de utilizar la sintaxis $ parent.
Concluiré esta publicación diciendo que es puramente su elección si desea usar el controlador como sintaxis o el objeto $ scope. Tampoco hay una gran ventaja o desventaja, simplemente que el controlador como sintaxis que tiene control sobre el contexto es un poco más fácil de trabajar, dada la clara separación en los controladores anidados en la vista.
fuente
Creo que la principal ventaja es una API más intuitiva ya que los métodos / propiedades están asociados con la instancia del controlador directamente y no con el objeto de alcance. Básicamente, con el viejo enfoque, el controlador se convierte en una simple decoración para construir el objeto de alcance.
Aquí hay más información sobre esto: http://www.syntaxsuccess.com/viewarticle/551798f20c5f3f3c0ffcc9ff
fuente
Por lo que he leído, $ scope se eliminará en Angular 2.0, o al menos cómo vemos el uso de $ scope. Puede ser bueno comenzar a usar el controlador a medida que se acerca el lanzamiento de 2.0.
Enlace de video aquí para más discusión al respecto.
fuente