switch personalizadas directivas angularjs angularjs-directive angularjs-scope

angularjs - personalizadas - ¿Cómo enlazar valores booleanos en directivas angulares?



ng switch angular 6 (5)

Cree un ámbito en la directiva que establece la vinculación bidireccional:

app.controller(''ctrl'', function($scope) { $scope.list = { name: ''Test'', collapsed: true, items: [1, 2, 3] }; }); app.directive(''list'', function() { return { restrict: ''E'', scope: { collapsed: ''='', name: ''='', items: ''='' }, template: ''<div>'' + ''{{name}} collapsed: {{collapsed}}'' + ''<div ng-show="!collapsed">'' + ''<div ng-repeat="item in items">Item {{item}}</div>'' + ''</div>'' + ''<br><input type="button" ng-click="collapsed = !collapsed" value="Inside Toggle">'' + ''</div>'' }; });

Luego pasa las opciones como atributos:

<list items="list.items" name="list.name" collapsed="list.collapsed"></list>

http://jsfiddle.net/aaGhd/3/

Me gustaría vincular / establecer algunos atributos booleanos a una directiva. Pero realmente no sé cómo hacer esto y lograr el siguiente comportamiento.

Imagina que quiero establecer una bandera en una estructura, digamos que una lista es plegable o no. Tengo el siguiente código HTML:

<list items="list.items" name="My list" collapsable="true"></list>

items están enlazados en dos direcciones, el name es solo un atributo

Me gustaría que ese atributo collapsable esté disponible en el ámbito $ de la lista, ya sea pasando un valor (verdadero, falso o lo que sea), ya sea un enlace de dos vías

<list items="list.items" name="{{list.name}}" collapsable="list.collapsed"></list>

Estoy desarrollando algunos componentes de la interfaz de usuario y me gustaría proporcionar una forma múltiple de interactuar con ellos. Tal vez, con el tiempo, a algunos chicos les gustaría saber el estado de ese componente, ya sea colapsado o no, al pasar la propiedad de un objeto al atributo.

¿Hay una manera de lograr esto? Por favor, corríjame si entendí algo o me equivoco.

Gracias


Dado que Angular 1.3 attrs. $ Observe parece desencadenar también atributos no definidos, por lo que si desea tener en cuenta un atributo no definido, debe hacer algo como:

link: function(scope, element, attrs) { attrs.$observe(''collapsable'', function() { scope.collapsable = scope.$eval(attrs.collapsable); if (scope.collapsable === undefined) { delete scope.collapsable; } }); },


No puede pasar cadenas true o false como el valor de atributo, y también admite pasar una propiedad de ámbito como list.collapsed como el valor de atributo para enlace de dos vías. Tienes que elegir de una forma u otra.

Esto se debe a que solo puede especificar una forma de interpretar el valor del atributo en su directiva cuando utiliza un ámbito de aislamiento.

Supongo que podría usar = en su directorio, y también verificar su función de enlace si attrs.collapsable se establece en true o false : si es así, entonces sabe que se pasó un valor booleano, y si no, use los datos de dos vías Unión. Pero esto es hacky.


Puede configurar su propio comportamiento de enlace de datos de 1 vía para booleanos como este:

link: function(scope, element, attrs) { attrs.$observe(''collapsable'', function() { scope.collapsable = scope.$eval(attrs.collabsable); }); }

El uso de $ observe aquí significa que su "observación" solo se ve afectada por el cambio de atributo y no se verá afectado si cambia directamente el $ scope.collapsable dentro de su directiva.


Sé que tengo un año de retraso en esto, pero en realidad puedes hacerlo usando la función de enlace ( https://docs.angularjs.org/guide/directive ). La firma se ve así:

function link(scope, element, attrs) { ... }

Ese objeto attrs se completará con los valores sin procesar que se pasaron. Así que podría decir si (attrs.collapsed == ''true'') {...} o algo así.