错误:用于指令“myFacebook”的expression式'undefined'是不可分配的

我正在写一个angularjs的指令,并得到上述错误。 我正在使用书中的代码。

.directive('myFacebook', [function(){ return { link: function(scope,element,attributes) { (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}}' }}]) 

我得到错误

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

HTML代码

 <div my-facebook></div> <h1> My Friend's Birthday Reminder</h1> <div ng-repeat="friend in myFriends"> {{friend.name}} </div> 

问题是你没有在指令元素<div my-facebook></div>定义属性friends

当你像这样定义指令的作用域时:

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

你基本上是在说:

  • 为本地作用域的permissions属性绑定同名DOM属性的值
  • 在本地作用域的myFriends属性和父作用域的friends属性之间设置双向绑定

由于您没有在DOM中定义属性friends ,Angular无法创build双向绑定并抛出错误。 更多信息在这里 。

在你的DOM上定义friends属性,它应该解决这个问题:

 <div my-facebook friends="friendList"></div> 

并且,例如,在控制器上:

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

我的解决scheme很难在这里find,但更容易实施。 我不得不改变它的等价物 (注意,问号使属性成为可选的,在1.5之前这显然不是必需的)。

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

不是OP问题的直接答案,但是这只是发生在我身上,对于任何其他人可能在未来谷歌这个错误。 这与JohnP的回答相似。

如果您的指令中有camelCase属性,也会出现此错误。

所以如果你有:

<div my-facebook myFriends></div>

它会抛出错误。

这是因为(取自angular度文件 ):

Angular规范化元素的标签和属性名称,以确定哪些元素匹配哪些指令。 我们通常通过区分大小写的camelCase标准化名称(例如ngModel)来引用指令。 但是,由于HTML不区分大小写,因此我们通过小写forms引用DOM中的指令,通常使用DOM元素(例如ng-model)上的以短划线定界的属性。

规范化过程如下:

从元素/属性的前面剥离x-data-

:-_ -delimited名称转换为camelCase。

所以<div my-facebook myFriends></div>

将需要成为<div my-facebook my-friends></div>

我跑到这个相同的问题,对我来说,问题是在DOM名称中的大写字符。

 <div my-facebook FRIENDS="friendList"></div> 

没有工作,但是

 <div my-facebook friends="friendList"></div> 

工作。 我花了一天的时间在这个工作上,发现了这个解决scheme。