J'essaie d'obtenir un attribut évalué de ma directive personnalisée, mais je ne trouve pas la bonne façon de le faire.
J'ai créé ce jsFiddle pour élaborer.
<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'est-ce que je rate?
javascript
binding
angularjs
directive
Shlomi Schwartz
la source
la source
Réponses:
Remarque: je mets à jour cette réponse car je trouve de meilleures solutions. Je garde également les anciennes réponses pour référence future tant qu'elles restent liées. La dernière et la meilleure réponse vient en premier.
Meilleure réponse:
Les directives dans angularjs sont très puissantes, mais il faut du temps pour comprendre quels processus se cachent derrière elles.
Lors de la création de directives, angularjs vous permet de créer une portée isolée avec quelques liaisons à la portée parent. Ces liaisons sont spécifiées par l' attribut auquel vous attachez l'élément dans DOM et la façon dont vous définissez la propriété scope dans l' objet de définition de directive .
Il existe 3 types d'options de liaison que vous pouvez définir dans la portée et que vous écrivez en tant qu'attribut lié aux préfixes.
HTML
Dans ce cas, dans le champ d'application de la directive (que ce soit dans la fonction de liaison ou le contrôleur), nous pouvons accéder à ces propriétés comme ceci:
"Toujours OK" Réponse:
Depuis que cette réponse a été acceptée, mais a quelques problèmes, je vais la mettre à jour pour une meilleure. Apparemment,
$parse
c'est un service qui ne réside pas dans les propriétés de la portée actuelle, ce qui signifie qu'il ne prend que des expressions angulaires et ne peut pas atteindre la portée.{{
, les}}
expressions sont compilées lors de l'initiation de angularjs, ce qui signifie que lorsque nous essayons d'y accéder dans notrepostlink
méthode de directives , elles sont déjà compilées. ({{1+1}}
est2
déjà dans la directive).Voici comment vous souhaitez utiliser:
.
Une chose que vous devez noter ici est que, si vous souhaitez définir la chaîne de valeur, vous devez la mettre entre guillemets. (Voir 3e entrée)
Voici le violon avec lequel jouer: http://jsfiddle.net/neuTA/6/
Ancienne réponse:
Je ne supprime pas cela pour les gens qui peuvent être induits en erreur comme moi, notez que l'utilisation
$eval
est parfaitement bien la bonne façon de le faire, mais$parse
a un comportement différent, vous n'aurez probablement pas besoin de cela pour utiliser dans la plupart des cas.La façon de le faire est, encore une fois, d'utiliser
scope.$eval
. Non seulement il compile l'expression angulaire, mais il a également accès aux propriétés de la portée actuelle.Ce qui vous manquait était
$eval
.la source
$scope.text
ne sera pas défini dans la fonction de liaison. D'après la formulation actuelle de la réponse, il semble qu'elle ne serait pas indéfinie. Vous devez utiliser $ observ () (ou $ watch () fonctionnera également ici) pour voir de manière asynchrone la valeur interpolée. Voir ma réponse et aussi stackoverflow.com/questions/14876112/…$parse
service est injecté puis jamais utilisé. Suis-je en train de manquer quelque chose?Pour une valeur d'attribut qui doit être interpolée dans une directive qui n'utilise pas une portée isolée, par exemple,
utiliser la méthode des attributs
$observe
:Depuis la page des directives ,
Si la valeur d'attribut est juste une constante, par exemple,
vous pouvez utiliser $ eval si la valeur est un nombre ou un booléen, et vous voulez le type correct:
Si la valeur d'attribut est une constante de chaîne ou si vous souhaitez que la valeur soit de type chaîne dans votre directive, vous pouvez y accéder directement:
Dans votre cas, cependant, puisque vous souhaitez prendre en charge les valeurs et les constantes interpolées, utilisez
$observe
.la source
Les autres réponses ici sont très correctes et précieuses. Mais parfois, vous voulez simplement: obtenir une ancienne valeur analysée simple lors de l'instanciation de la directive, sans avoir besoin de mises à jour et sans gâcher la portée de l'isolat. Par exemple, il peut être utile de fournir une charge utile déclarative dans votre directive sous forme de tableau ou d'objet de hachage sous la forme:
Dans ce cas, vous pouvez aller droit au but et utiliser simplement un joli basique
angular.$eval(attr.attrName)
.Violon de travail .
la source
Pour la même solution que je cherchais
Angularjs directive with ng-Model
.Voici le code qui résout le problème.
DOM HTML
Mon résultat est:
la source
Utilisez $ timeout car la directive appelle après le chargement de dom pour que vos modifications ne s'appliquent pas
la source