Javascript 角度值在打印时进行分析,但不是作为指令属性

Javascript 角度值在打印时进行分析,但不是作为指令属性,javascript,data-binding,angularjs,directive,Javascript,Data Binding,Angularjs,Directive,我有一个名为addressesForUser的地址数组。我还有一个带有隔离作用域的“address”指令 当我这样做时: <div ng-repeat="add in addressesForUser" entryid="{{ add.id }}">{{ add.id }}</div> <address ng-repeat="add in addressesForUser" entryid="{{ add.id }}"></ad

我有一个名为
addressesForUser
的地址数组。我还有一个带有隔离作用域的“address”指令

当我这样做时:

<div ng-repeat="add in addressesForUser" entryid="{{ add.id }}">{{ add.id }}</div>            
<address ng-repeat="add in addressesForUser" entryid="{{ add.id }}"></address>

经过进一步的修补,我意外地找到了解决办法。文档确实需要在这方面做更多的工作

本质上,隔离范围需要定义为:

scope: {entryid: "="}
然后通过作用域(而不是attrs)访问该值,如中所示

console.log(scope.entryid);

这里的问题实际上是,在指令中,不能假设当
链接
函数运行时属性已就绪。如果对该值进行插值,则该值通常不可用。访问属性的标准方法是通过
$observe

链接:函数(范围、元素、属性){
属性$observe('entryid',函数(val){
//用val做点什么
});
}

如果您使用的是隔离作用域,那么为公共属性添加作用域属性可能是一个好主意,但是您仍然不应该假定该值在
链接期间可用。如果可能需要插入值,则应始终使用
$observe
方法。

由于您的指令不修改
add.id
的值(因此不需要双向数据绑定),因此我建议使用
@
而不是
=
。使用
@
定义后,可以使用
attrs.$observe()
scope.$watch()
获取插值:

scope: {
   entryid: '@',
},
link: function (scope, element, attrs) {
    attrs.$observe('entryid', function(value) {
        console.log('observed value=',value);
    });
    scope.$watch('entryid', function(value) {
       console.log('watched value=',value);
    });
    ...
}

我认为您需要发布您的地址指令代码,以便更好地理解这个问题,一个[plunker](plnkr.co/edit/)示例会更好,无论如何,我认为这是因为隔离,那里有一些错误,我看不到指令代码就无法判断。使用指令代码更新了原始帖子。它是隔离作用域,如果我移除隔离,它就可以工作,但在这种情况下我需要它。正如你在回答中所说的解决方案
作用域:{entryid:'='}
,但是如果你要在模板中使用它,就像他在回答中所说的链接函数。有趣。但是,当我尝试将指令重新格式化为使用observe时,正如您所说,它从不插值
console.log(val)
给我add.id,字符串,而不是实际值,{{add.id}}也作为文本字符串返回。给你什么?你必须发布一个Plunker,因为这应该是通用的。希望这是在文档中的任何地方。Egghead也不能很好地涵盖这一点。谢谢你的解释。
console.log(scope.entryid);
scope: {
   entryid: '@',
},
link: function (scope, element, attrs) {
    attrs.$observe('entryid', function(value) {
        console.log('observed value=',value);
    });
    scope.$watch('entryid', function(value) {
       console.log('watched value=',value);
    });
    ...
}