Hay dos patrones en uso para acceder a las funciones del controlador: this
y $scope
.
¿Qué debo usar y cuándo? Entiendo que this
está configurado para el controlador y $scope
es un objeto en la cadena de alcance para las vistas. Pero con la nueva sintaxis "Controlador como Var", puede usar cualquiera de los dos fácilmente. Entonces, ¿qué es lo mejor y cuál es la dirección para el futuro?
Ejemplo:
Utilizando
this
function UserCtrl() { this.bye = function() { alert('....'); }; }
<body ng-controller='UserCtrl as uCtrl'> <button ng-click='uCtrl.bye()'>bye</button>
Utilizando
$scope
function UserCtrl($scope) { $scope.bye = function () { alert('....'); }; }
<body ng-controller='UserCtrl'> <button ng-click='bye()'>bye</button>
Personalmente, considero this.name
que es más fácil a la vista y más natural en comparación con otros patrones Javascript OO.
Consejos por favor?
Respuestas:
Ambos tienen sus usos. Primero, algo de historia ...
$ scope es la técnica "clásica", mientras que "controller as" es mucho más reciente (a partir de la versión 1.2.0 oficialmente, aunque apareció en versiones preliminares inestables antes de esto).
Ambos funcionan perfectamente bien y la única respuesta incorrecta es mezclarlos en la misma aplicación sin una razón explícita. Francamente, mezclarlos funcionará, pero solo aumentará la confusión. Así que elige uno y rueda con él. Lo más importante es ser consistente.
¿Cúal? Eso depende de ti. Hay muchos más ejemplos de $ alcance, pero "controlador como" también está ganando fuerza. ¿Es uno mejor que el otro? Eso es debatible. Entonces, ¿cómo eliges?
Comodidad
Prefiero el "controlador como" porque me gusta ocultar el $ alcance y exponer a los miembros del controlador a la vista a través de un objeto intermediario. Al configurar esto. *, Puedo exponer justo lo que quiero exponer del controlador a la vista. También puede hacer eso con $ scope, solo prefiero usar JavaScript estándar para esto. De hecho, lo codifico así:
Esto me parece más limpio y hace que sea más fácil ver lo que se expone a la vista. Observe que nombro la variable que devuelvo "vm", que significa viewmodel. Esa es solo mi convención.
Con $ scope puedo hacer lo mismo, así que no estoy agregando o quitando valor con la técnica.
Entonces depende de ti allí.
Inyección
Con $ scope necesito inyectar $ scope en el controlador. No tengo que hacer esto con el controlador como, a menos que lo necesite por alguna otra razón (como $ broadcast o relojes, aunque trato de evitar los relojes en el controlador).
ACTUALIZACIÓN Escribí esta publicación sobre las 2 opciones: http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/
fuente
var vm = this;
¿también necesita llamarlo 'vm' en la vista? 'controlador como vm'. ¿Tienen que ser iguales?$scope
se está eliminando en Angular 2.0. Por lo tanto, el usothis
sería un enfoque que otros quieren seguir a medida que se acerca la fecha de lanzamiento de Angular 2.0.fuente
Mi opinión es que 'esto' en javascript tiene suficientes problemas por sí mismo, y que agregar otro significado / uso no es una buena idea.
Usaría $ scope, por razones de claridad.
ACTUALIZAR
Ahora existe la sintaxis 'controlador como', discutida aquí . No soy un fanático, pero ahora que es una construcción AngularJS más "oficial" merece algo de atención.
fuente
Creo que Controller As es mejor ya que permite anidar más fácilmente los ámbitos como se describe por Todd Motto aquí:
http://toddmotto.com/digging-into-angulars-controller-as-syntax/
Además, asegurará que siempre tenga al menos uno. en su expresión vinculante que lo obliga a seguir la recomendación de no unirse a las primitivas .
Además, puede desacoplar el alcance que desaparecerá en 2.0.
fuente
La documentación angular le dice explícitamente que
this
se recomienda usar . Eso, además del hecho de que$scope
se está eliminando, es razón suficiente para que nunca lo use$scope
.fuente
El "alcance de $ Jason se está eliminando en Angular 2.0" me parece una buena razón. Y encontré otra razón para ayudarme a tomar la decisión:
this
es más legible : cuando veofooCtrl.bar
en HTML, inmediatamente sé dónde encontrar la definición debar
.Actualizaciones: poco después de cambiar a la
this
solución, comencé a perder la$scope
forma que necesita menos escribirfuente
Prefiero una combinación
Un simple console.log de $ scope y 'this' después de llenarlos con algunos datos simulados le mostrará eso.
$ scope permite el acceso a las partes debajo de las cubiertas de un controlador, por ejemplo:
** El equipo de Angular no recomienda jugar con las propiedades y los métodos con $$, pero $ puede ser un juego seguro para hacer cosas geniales con $ parent y $ id.
'this' va directo al grano, adjuntando datos y funciones de 2 vías. Solo verás lo que adjuntaste:
Entonces, ¿por qué prefiero una combinación?
En las aplicaciones anidadas de ui-router, puedo acceder al controlador principal, establecer y llamar a valores y funciones universales dentro de un controlador secundario:
En el controlador principal:
En el controlador infantil:
¡Ahora, puede acceder al padre desde dentro del niño y al niño desde el padre!
fuente
Ambos funcionan, pero si aplica las cosas que son apropiadas para el alcance a $ scope, y si aplica las cosas que son apropiadas para el controlador al controlador, su código será fácil de mantener. Para las personas que dicen "Ugh solo use el alcance, olvide este controlador como sintaxis" ... Puede funcionar igual, pero me pregunto cómo podrá mantener una aplicación enorme sin perder la noción de las cosas.
fuente