Necesito poder agregar, por ejemplo, "contenteditable" a los elementos, en función de una variable booleana en el alcance.
Ejemplo de uso:
<h1 attrs="{'contenteditable=\"true\"': editMode}">{{content.title}}</h1>
Resultaría en contenteditable = true que se agrega al elemento si $scope.editMode
se estableció en true
. ¿Hay alguna manera fácil de implementar este comportamiento de atributo de clase ng? Estoy considerando escribir una directiva y compartirla si no.
Editar: Puedo ver que parece haber algunas similitudes entre mi directiva attrs propuesta y ng-bind-attrs, pero se eliminó en 1.0.0.rc3 , ¿por qué?
angularjs
angularjs-directive
Kenneth Lynne
fuente
fuente
ng-attr="expression"
.contentEditable
directiva.<h1 ng-attr-contenteditable="{{editMode && true : false}}">{{content.title}}</h1>
Respuestas:
Estoy usando lo siguiente para establecer condicionalmente la clase attr cuando no se puede usar ng-class (por ejemplo, al diseñar SVG):
El mismo enfoque debería funcionar para otros tipos de atributos.
(Creo que necesitas estar en el último Angular inestable para usar ng-attr-, actualmente estoy en 1.1.4)
fuente
ng-attr-
, entonces el compilador eliminará el prefijo y agregará el atributo con su valor vinculado al resultado de la expresión angular del valor del atributo original.Puede prefijar atributos con
ng-attr
para evaluar una expresión angular. Cuando el resultado de las expresiones no está definido, esto elimina el valor del atributo.Producirá (cuando el valor es falso)
Así que no lo use
false
porque eso producirá la palabra "falso" como valor.Al usar este truco en una directiva. Los atributos de la directiva serán falsos si les falta un valor.
Por ejemplo, lo anterior sería falso.
fuente
undefined
es un caso especial. "Cuando se usa ngAttr, se usa el indicador allOrNothing de $ interpolate, por lo que si alguna expresión en la cadena interpolada resulta indefinida, el atributo se elimina y no se agrega al elemento".ng-attr-foo
seguirá siendo siempre invocar lafoo
directiva si se posee, aunqueng-attr-foo
evalúa aundefined
. discusiónObtuve esto trabajando configurando el atributo. Y controlar la aplicabilidad del atributo utilizando el valor booleano para el atributo.
Aquí está el fragmento de código:
Espero que esto ayude.
fuente
En la última versión de Angular (1.1.5), han incluido una directiva condicional llamada
ngIf
. Es diferente dengShow
yngHide
en que los elementos no están ocultos, pero no están incluidos en el DOM. Son muy útiles para componentes que son costosos de crear pero que no se usan:fuente
<h1 ng-if="editMode" contenteditable="true"><h1 ng-if="!editMode">
ng-if
crea un nuevo alcance.ng-if
crea un nuevo alcance perong-show
no lo hace. Esta inconsistencia siempre ha sido un punto doloroso para mí. La reacción de programación defensiva a esto es: "siempre se une a algo que es un punto en la expresión" y no será un problema.Para obtener un atributo que muestre un valor específico basado en una verificación booleana, o que se omita por completo si la verificación booleana falla, utilicé lo siguiente:
ng-attr-example="{{params.type == 'test' ? 'itWasTest' : undefined }}"
Ejemplo de uso:
<div ng-attr-class="{{params.type == 'test' ? 'itWasTest' : undefined }}">
Saldría
<div class="itWasTest">
o<div>
basado en el valor deparams.type
fuente
<h1 ng-attr-contenteditable="{{isTrue || undefined }}">{{content.title}}</h1>
producirá cuando isTrue = true:
<h1 contenteditable="true">{{content.title}}</h1>
y cuando isTrue = false:
<h1>{{content.title}}</h1>
fuente
<h1 ng-attr-contenteditable="{{isTrue ? 'row' : undefined}}">{{content.title}} </h1>
<video ng-attr-autoplay="{{vm.autoplay || undefined}}" />
Con respecto a la solución aceptada, la publicada por Ashley Davis, el método descrito todavía imprime el atributo en el DOM, independientemente del hecho de que el valor que se le ha asignado no está definido.
Por ejemplo, en una configuración de campo de entrada con un modelo ng y un atributo de valor:
Independientemente de lo que esté detrás de myValue, el atributo de valor todavía se imprime en el DOM, por lo tanto, se interpreta. Ng-model entonces, se anula.
Un poco desagradable, pero usar ng-if funciona:
Recomendaría usar una verificación más detallada dentro de las directivas ng-if :)
fuente
También puedes usar una expresión como esta:
fuente
De hecho, escribí un parche para hacer esto hace unos meses (después de que alguien me lo preguntó en #angularjs en freenode).
Probablemente no se fusionará, pero es muy similar a ngClass: https://github.com/angular/angular.js/pull/4269
Ya sea que se fusione o no, el material ng-attr- * existente probablemente sea adecuado para sus necesidades (como otros han mencionado), aunque podría ser un poco más complicado que la funcionalidad más ngClass-style que está sugiriendo.
fuente
Para la validación del campo de entrada puede hacer:
Esto se aplicará el atributo
max
de100
sólo sidiscountType
se define como%
fuente
Editar : ¡Esta respuesta está relacionada con Angular2 +! Lo siento, me perdí la etiqueta!
Respuesta original:
En cuanto al caso muy simple cuando solo desea aplicar (o establecer) un atributo si se estableció un cierto valor de entrada, es tan fácil como
Es lo mismo que:
(Por lo tanto, opcionalValue se aplica si se da lo contrario, la expresión es falsa y el atributo no se aplica).
Ejemplo: tuve el caso, donde dejé aplicar un color pero también estilos arbitrarios, donde el atributo de color no funcionaba como ya estaba establecido (incluso si no se proporcionó el color @Input ()):
Por lo tanto, "style.color" solo se estableció cuando el atributo de color estaba allí; de lo contrario, se podría usar el atributo de color en la cadena "styles".
Por supuesto, esto también podría lograrse con
y
fuente
En caso de que necesite una solución para Angular 2, entonces es simple, use el enlace de propiedades como se muestra a continuación, por ejemplo, si desea que la entrada se lea solo condicionalmente, luego agregue entre corchetes el atributo seguido de = signo y expresión.
fuente
Pude hacer que esto funcionara:
Lo bueno aquí es que si item.isSelected es falso, entonces el atributo simplemente no se representa.
fuente