Estoy tratando de obtener un atributo evaluado de mi directiva personalizada, pero no puedo encontrar la forma correcta de hacerlo.
He creado este jsFiddle para elaborar.
<div ng-controller="MyCtrl">
<input my-directive value="123">
<input my-directive value="{{1+1}}">
</div>
myApp.directive('myDirective', function () {
return function (scope, element, attr) {
element.val("value = "+attr.value);
}
});
¿Qué me estoy perdiendo?
javascript
binding
angularjs
directive
Shlomi Schwartz
fuente
fuente
Respuestas:
Aviso: actualizo esta respuesta a medida que encuentro mejores soluciones. También mantengo las viejas respuestas para referencia futura siempre que sigan relacionadas. La última y mejor respuesta es lo primero.
Mejor respuesta
Las directivas en angularjs son muy poderosas, pero lleva tiempo comprender qué procesos hay detrás de ellas.
Al crear directivas, angularjs le permite crear un ámbito aislado con algunos enlaces al ámbito primario. Estos enlaces están especificados por el atributo que adjunta el elemento en DOM y cómo define la propiedad del alcance en el objeto de definición de directiva .
Hay 3 tipos de opciones de enlace que puede definir en alcance y las escribe como atributo relacionado con prefijos.
HTML
En ese caso, en el ámbito de la directiva (ya sea en función de enlace o controlador), podemos acceder a estas propiedades de esta manera:
"Aún está bien" Respuesta:
Dado que esta respuesta fue aceptada, pero tiene algunos problemas, la actualizaré a una mejor. Aparentemente,
$parse
es un servicio que no reside en las propiedades del alcance actual, lo que significa que solo toma expresiones angulares y no puede alcanzar el alcance.{{
, las}}
expresiones se compilan mientras se inicia angularjs, lo que significa que cuando intentamos acceder a ellas en nuestropostlink
método de directivas , ya están compiladas. (ya{{1+1}}
está2
en la directiva).Así es como te gustaría usar:
.
Una cosa que debe notar aquí es que, si desea establecer la cadena de valor, debe ajustarla entre comillas. (Ver tercera entrada)
Aquí está el violín para jugar: http://jsfiddle.net/neuTA/6/
Vieja respuesta:
No estoy eliminando esto para las personas que pueden ser engañadas como yo, tenga en cuenta que usar
$eval
está perfectamente bien la forma correcta de hacerlo, pero$parse
tiene un comportamiento diferente, probablemente no necesite usarlo en la mayoría de los casos.La forma de hacerlo es, una vez más, usando
scope.$eval
. No solo compila la expresión angular, sino que también tiene acceso a las propiedades del ámbito actual.Lo que te estás perdiendo fue
$eval
.fuente
$scope.text
estará indefinido en la función de vinculación. La forma en que la respuesta está redactada actualmente, parece que no estaría indefinida. Debe usar $ observe () (o $ watch () en realidad también funcionará aquí) para ver asincrónicamente el valor interpolado. Vea mi respuesta y también stackoverflow.com/questions/14876112/…$parse
servicio se inyecta y luego nunca se usa. ¿Me estoy perdiendo de algo?Para un valor de atributo que necesita ser interpolado en una directiva que no utiliza un alcance aislado, por ejemplo,
use el método de los atributos
$observe
:Desde la página de la directiva ,
Si el valor del atributo es solo una constante, por ejemplo,
puede usar $ eval si el valor es un número o booleano, y desea el tipo correcto:
Si el valor del atributo es una constante de cadena, o si desea que el valor sea de tipo cadena en su directiva, puede acceder a él directamente:
Sin embargo, en su caso, dado que desea admitir valores y constantes interpolados, use
$observe
.fuente
Las otras respuestas aquí son muy correctas y valiosas. Pero a veces solo quieres lo simple: obtener un valor analizado antiguo simple en la instanciación de directivas, sin necesidad de actualizaciones y sin alterar el alcance de aislamiento. Por ejemplo, puede ser útil proporcionar una carga útil declarativa en su directiva como una matriz o un objeto hash en la forma:
En ese caso, puede ir al grano y simplemente usar un buen básico
angular.$eval(attr.attrName)
.Fiddle de trabajo .
fuente
Por la misma solución que estaba buscando
Angularjs directive with ng-Model
.Aquí está el código que resuelve el problema.
DOM HTML
Mi resultado es:
fuente
Use $ timeout porque la directiva llama después de dom load para que sus cambios no se apliquen
fuente