renderizar escape angularjs angularjs-directive angularjs-controlleras

angularjs - escape - Uso de ControllerAs con una directiva



ng-bind-html angularjs (4)

Con "controllerAs", el alias de instancia del controlador, vm , en su caso, se publica en el ámbito como la propiedad .vm del ámbito.

Por lo tanto, para acceder a sus propiedades (es decir, las propiedades del controlador), debe especificar {{vm.text}} o ng-click="vm.click" .

Estoy tratando de seguir la guía de estilo angularJS de John Papa here y he comenzado a cambiar mis directivas para usar controllerAs. Sin embargo, esto no está funcionando. Parece que mi plantilla no puede acceder a nada asignado a vm. Vea este ejemplo muy simple de plnkr que exhibe el comportamiento.

http://plnkr.co/edit/bVl1TcxlZLZ7oPCbk8sk?p=preview

angular .module(''app'', []); angular .module(''app'') .directive(''test'', test); function test() { return { restrict: ''E'', template: ''<button ng-click="click">{{text}}</button>'', controller: testCtrl, controllerAs: ''vm'' } } angular .module(''app'') .controller(''testCtrl'', testCtrl); function testCtrl() { var vm = this; vm.text = "TEST"; }


Cuando se utiliza la sintaxis de " controllerAs ", como se indicó anteriormente, el alcance está vinculado a la referencia " this " del controlador. Por lo tanto, nos permite introducir un nuevo espacio de nombres ( ''vm'' ) vinculado a nuestro controlador sin la necesidad de poner las propiedades del alcance en un objeto literal adicional (por ejemplo, $ alcance ). Así que acceder a cualquier cosa en el alcance del controlador, requiere espacio de nombres ''vm'' , como,

''<button ng-click="click">{{vm.text}}</button>''


Cuando usa la sintaxis de controllerAs , entonces tiene que usar

bindToController: true

Funcionará en su directiva.


Cuando utiliza la sintaxis de controllerAs, no accede al $ scope como lo haría normalmente, la variable vm se agrega al alcance, por lo que su botón debe convertirse en:

<button ng-click="click">{{vm.text}}</button>

Note el vm. añadido al principio del text .

Aquí hay un tenedor de tu Plunk con la corrección aplicada.

P: ¿Sabe cómo accedería a los atributos pasados ​​como atributos a la directiva, ejemplo "alcance: {texto: ''@''}"? ¿Entonces me veo forzado a usar $ scope en el controlador y configurar vm.text = $ scope.text?

R: En el artículo al que hace referencia, hay una sección y075 que habla solo de este escenario. Mira en bindToController :

return { restrict: ''E'', template: ''<button ng-click="click">{{text}}</button>'', controller: testCtrl, controllerAs: ''vm'', scope: { text: ''@'' }, bindToController: true // because the scope is isolated };

Entonces deberías poder acceder a vm.text