javascript - parameter - scope directive angularjs
DevoluciĆ³n de llamada y alcance de las directivas (1)
Buena pregunta. Este tipo de decisiones se deben tomar primero desde la perspectiva de tratar de separar sus preocupaciones. Por lo tanto, tenemos que eliminar la posibilidad de llamar a un método en el ámbito principal: la directiva debe saber demasiado sobre el padre.
Luego, miramos el propósito. Las rellamadas son métodos por definición. &
evalúa una expresión en el contexto del alcance principal, mientras que un enlace bidireccional es solo un nombre de variable. &
es mucho más potente y le da al usuario de su directiva más flexibilidad. Claro, podrían hacer esto, como en tu ejemplo:
<my-dir cb="callMe()"></my-dir>
Pero también podrían hacer esto:
<my-dir cb="myVar = false"></my-dir>
No tenemos que pasar el nombre de una variable, es cualquier expresión AngularJS. De modo que el usuario del componente puede reaccionar de forma gratuita a su evento de la forma que más le convenga. ¡Increíble!
Pero también, la directiva puede reaccionar a los cambios de estado. Por ejemplo, puede verificar una condición:
<my-dir cb="myVar"></my-dir>
Y myVar
puede evaluar cualquier valor y su directiva puede tomar conciencia siempre que esto cambie y reaccionar en consecuencia. En lugar de compartir una variable , estás compartiendo una expresión . En este caso, una unión bidireccional funcionaría, pero si la directiva no cambia (y tal vez no debería) esa variable, ¿por qué necesitamos una unión bidireccional?
Pero nuevamente, no necesita ser una variable. ¿Qué tal una expresión que se evalúa como verdadera o falsa?
<my-dir cb="myVar == myOtherVar"></my-dir>
A nuestra directiva no le debe importar cómo el alcance principal llega a un valor, solo cuál es el valor eventualmente.
Entonces, podemos usarlo para que el alcance padre reaccione a la directiva o para que la directiva reaccione ante el padre, todo con expresiones flexibles. Ordenado.
Entonces, =
es para garantizar el enlace de datos; asegura que el alcance en el que se utilizó la directiva y la propia directiva permanecen sincronizadas en una determinada variable. &
permite evaluar expresiones en el contexto del alcance padre y para que la directiva o el alcance padre reaccionen a cambios de estado potencialmente complejos.
Estoy tratando de abarcar ámbitos en angularjs, particularmente cuando se trata de invocar devoluciones de llamada en el módulo que está usando una directiva. Encontré 3 formas diferentes de lograr lo mismo y trato de entender los pros / contras de cada enfoque.
¿Cuándo es apropiado usar &
, =
o funciones de llamada directamente en el padre?
Prefiero vincular con el signo ''='', ya que se requiere menos código en la directiva y en el módulo que aloja la directiva, pero de acuerdo con la documentación (Comprensión de la transclusión y los ámbitos) parece que vinculante para las devoluciones de llamada con el &
es el preferido método, ¿por qué?