错误:用于指令“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。