Erreur: Expression ‘undefined’ utilisée avec la directive ‘myFacebook’ n’est pas assignable

J’écris une directive dans angularjs et obtenir l’erreur mentionnée ci-dessus. J’utilise le code d’un livre.

.directive('myFacebook', [function(){ return { link: function(scope,element,atsortingbutes) { (function(d) { var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) { return; } js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js"; ref.parentNode.insertBefore(js, ref); }(document)); // Initialize FB window.fbAsyncInit = function() { FB.init({ appId: 'xxxx', //birthday reminder status: true, // check login status cookie: true, // enable cookies to access the session xfbml: false // parse XFBML }); //Check FB Status FB.getLoginStatus(function(response) { xxxx }); }; scope.username=''; }, scope: { permissions: '@', myFriends: '=friends' }, controller: function($scope) { $scope.loadFriends = function() { FB.api('/me/friends?fields=birthday,name,picture', function(response) { $scope.$apply(function() { $scope.myFriends = response.data; }); }); } }, template:'Welcome {{username}}' }}]) 

J’ai une erreur à

  $scope.$apply(function() { $scope.myFriends = response.data; }); 

Le code HTML

 

My Friend's Birthday Reminder

{{friend.name}}

Le problème est que vous ne définissez pas les friends atsortingbut dans l’élément directive

.

Lorsque vous définissez la scope de la directive comme ceci:

 scope: { permissions: '@', myFriends: '=friends' } 

Vous dites essentiellement:

  • Lier à la propriété d’ permissions l’étendue locale la valeur de l’atsortingbut DOM portant le même nom
  • Configurer une liaison bidirectionnelle entre la propriété myFriends l’étendue locale et la propriété friends l’étendue parent

Puisque vous ne définissez pas les atsortingbuts de l’atsortingbut dans le DOM, Angular ne peut pas créer la liaison bidirectionnelle et génère l’erreur. Plus d’informations ici .

Définir l’atsortingbut friends sur votre DOM et résoudre le problème:

 

Et, par exemple, sur le contrôleur:

 app.controller('Ctrl', function($scope) { $scope.friendList = []; }); 

Ma solution était plus difficile à trouver ici, mais plus facile à mettre en œuvre. Je devais le changer pour l’ équivalent de (Notez que le point d’interrogation rend l’atsortingbut facultatif. Avant la version 1.5, cela n’était apparemment pas nécessaire).

 scope: { permissions: '@', myFriends: '=?friends' } 

Ce n’est pas une réponse directe à la question des OP, mais c’est ce qui m’est arrivé, donc pour toute autre personne qui risquerait cette erreur à l’avenir. Ceci est similaire à la réponse de JohnP.

Cette erreur peut également apparaître si vous avez un atsortingbut camelCase dans votre directive.

Donc, si vous avez:

Cela jettera l’erreur.

C’est parce que (tiré de la documentation angular):

Angular normalise la balise et le nom de l’atsortingbut d’un élément pour déterminer quels éléments correspondent aux directives. Nous nous référons généralement aux directives par leur nom normalisé (par exemple, ngModel). Cependant, puisque HTML est insensible à la casse, nous nous référons aux directives dans le DOM par des formes minuscules, en utilisant généralement des atsortingbuts délimités par des tirets sur les éléments DOM (par exemple, ng-model).

Le processus de normalisation est le suivant:

Dénudez x- et les data- à l’avant de l’élément / des atsortingbuts.

Convertissez le nom délimité par:, - ou _ en camelCase.

alors

devra devenir

Je cours à ce même problème et pour moi, le problème était des caractères majuscules dans le nom de DOM.

 

n’a pas fonctionné, mais

 

travaillé. J’ai passé une journée à travailler là-dessus et j’ai trouvé la solution par accident.