remove - setattribute javascript




Vérifier l'existence d'attribut dans la directive angulaire (3)

La façon de faire ce que vous voulez est en regardant l'objet attribut dans la fonction de lien:

link: 
  function(scope, element, attrs) {
    if("status" in attrs)
       //do something
  }

Il est possible de vérifier si un attribut donné est présent dans une directive, idéalement en utilisant isolate scope ou dans le pire des cas, l’objet attributs.

Avec une directive ressemblant à quelque chose comme ceci <project status></project> , je souhaite restituer sous condition une icône d'état, mais uniquement si l'attribut status est présent.

return {
  restrict: 'AE',
  scope: {
    status: '@'
  },
  link: function(scope, element, attrs) {
    scope.status === 'undefined'
  }
}

Idéalement, il serait lié directement à la portée, de sorte qu'il puisse être utilisé dans le modèle. Cependant, la valeur de la variable liée est indéfinie . Il en va de même pour les liaisons & read-only et = bidirectionnelles .

Je sais que la solution est triviale en ajoutant un <project status='true'></project> , mais pour les directives que j'utiliserai fréquemment, je préférerais ne pas avoir à le faire. (Validité XHTML, n'est pas un problème).


Pour ce faire, vous devez vérifier l'existence des attributs dans le paramètre attrs de la fonction link et l'affecter à des variables situées dans la portée isolate de votre directive.

scope:{},
link: function(scope, element, attrs){
  scope.status = 'status' in attrs;
},

Cela devrait fonctionner sans avoir à utiliser une instruction if dans votre fonction de lien.


Puisque la valeur attrs est le type d' object javascript. Pour vérifier l'existence d'attributs, nous pouvons également utiliser la méthode hasOwnProperty() place in mot-clé.

Donc, ça pourrait être:

link: function(scope, element, attrs) {
  var is_key_exist = attrs.hasOwnProperty('status');//Will return true if exist
}

Vous pouvez lire plus loin la différence entre les hasOwnProperty() in keyword et hasOwnProperty() sur ce link





angularjs-scope