tag attribute javascript angularjs angularjs-directive angularjs-scope angularjs-controller

javascript - attribute - title html



"Controlador como" vs alcance aislado (2)

Es difícil encontrar un patrón "oficial" para hacer esto. Personalmente, creo que depende de cuál sea tu objetivo.

Si desea exponer la información de una Directiva al mundo exterior, use el Alcance aislado, ya que esa es una de las razones por las que está allí. Esa ''API'' no tiene que estar completamente definida en la Directiva, se puede definir en un Servicio AngularJS que usted inyecta en una Directiva y expone a través del Alcance Aislado de esa manera, tiene una Directiva que se ocupa principalmente de la interfaz de usuario Junto con un servicio que maneja cualquier lógica empresarial.

Si se está comunicando entre directivas, es donde se prefiere un controlador.

Pero para intentar obtener más información oficial, aquí hay información del sitio web de AngularJS sobre el uso de controladores con directivas:

Práctica recomendada: utilice el controlador cuando desee exponer una API a otras directivas. De lo contrario utilice el enlace.

Personalmente, nunca he visto a los Controladores en las Directivas, a excepción de la comunicación de Directiva a Directiva. No estoy diciendo que no puedas usarlos, simplemente no lo he visto. Además, si quisiera exponer la lógica del Controlador al mundo exterior, tendría que vincularse al ámbito aislado de todos modos, de modo que todo depende realmente de lo que quiera hacer.

Me gustaría usar la opción ''controllerAs'' en mis directivas. Permítanme citar el razonamiento de la " Guía de estilo de AngularJS para usuarios de cierre en Google ":

¿Por qué? Poner métodos y propiedades directamente en el controlador, en lugar de crear un objeto de alcance, se adapta mejor al estilo de clase de cierre de Google. Además, el uso de ''controlador como'' hace que sea obvio a qué controlador está accediendo cuando varios controladores se aplican a un elemento. Ya que siempre hay un ''.'' en los enlaces, no tiene que preocuparse por las primitivas de enmascaramiento de herencia de prototipos.

Pero puedo ver un problema con el uso de este enfoque si la directiva tiene vínculos de alcance aislados.

angular.module(''cmw'').directive(''fooWidget'', function() { return { controller: function() { this.qux = ''123''; }, controllerAs: ''fooWidget'', scope: { bar: ''='' }, template: '' {{fooWidget.qux}} {{bar}} '' }; });

En este caso, la propiedad de la bar se adjunta al ámbito, no al controlador, lo que da como resultado una situación incoherente y confusa donde se deben buscar diferentes propiedades en diferentes lugares. ¿Cuál es la forma recomendada por el "oficial" para solucionar esto?

ACTUALIZACIÓN: ver el problema de GitHub sobre esto.


Esto se resolvió en Angular 1.3 agregando la propiedad bindToController a la API de la directiva .