¿Por qué los documentos de AngularJS no utilizan un punto en la directiva del modelo?
En el video AngularJS MTV Meetup: Mejores prácticas (11/12/2012) , Miško explica "...si usas ng-model tiene que haber un punto en alguna parte. Si no tienes un punto, lo estás haciendo equivocado.."
Sin embargo, el primer ejemplo (Conceptos básicos) en el sitio web Angular.JS parece contradecirlo. ¿Lo que da? ¿Ha cambiado Angular.JS desde la reunión de MTV y ahora es más indulgente con ng-model?
Ese pequeño punto es muy importante cuando se trata de las complejidades de la herencia de alcance.
El vídeo de egghead.io "The Dot" tiene una muy buena descripción general, al igual que esta pregunta muy popular sobre desbordamiento de pila: ¿Cuáles son los matices de la herencia prototípica/prototípica de alcance en AngularJS?
Intentaré resumirlo aquí:
Angular.js utiliza la herencia de alcance para permitir que un alcance secundario (como un controlador secundario) vea las propiedades del alcance principal. Entonces, digamos que tienes una configuración como:
<div ng-controller="ParentCtrl">
<input type="text" ng-model="foo"/>
<div ng-controller="ChildCtrl">
<input type="text" ng-model="foo"/>
</div>
</div>
( Sigue el juego en un JSFiddle )
Al principio, si iniciaba la aplicación y escribía la entrada de los padres, el niño se actualizaría para reflejarla.
Sin embargo, si edita el ámbito secundario, la conexión con el principal ahora se interrumpe y los dos ya no se sincronizan. Por otro lado, si usas ng-model="baz.bar"
, el enlace permanecerá.
La razón por la que esto sucede es porque el ámbito secundario utiliza herencia prototípica para buscar el valor, por lo que siempre que nunca se establezca en el ámbito secundario, se diferirá al ámbito principal. Pero, una vez configurado, ya no busca al padre.
Cuando utiliza un objeto ( baz
), nunca se establece nada en el ámbito secundario y la herencia permanece.
Para obtener detalles más detallados, consulte la respuesta de StackOverflow.
Se requerirá Dot cuando, de manera prototípica, herede un alcance de otro, por ejemplo, en el caso de ng-repeat, se crea un nuevo alcance para cada elemento de línea que hereda prototípicamente del alcance principal. En el ejemplo básico no hay herencia de prototipo ya que solo hay un ámbito, pero si tiene varios ámbitos secundarios, comenzará a enfrentar el problema. El siguiente enlace aclarará todo.
https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-repeat