我是Angular JS的新手,我正在尝试创建一个将使用的自定义指令:
<div linkedlist listcolumns="{{cashAccountsColumns}}"></div>
Corrps。 控制器将是:
$scope.cashAccountsColumns = [
{"field": "description", "title": "Description"},
{"field": "owner", "title":"Owner"},
{"field": "currentBalance", "title":"Current Balance" }
];
指令代码是:
return {
restrict : 'EA',
transclude : false,
templateUrl : 'html/linkedlist.html',
scope: {
listcolumns: "@"
},
link : function(scope, element, attrs) {
}
}
模板是:
<table class="box-table" width="100%">
<thead>
<tr>
<th scope="col" ng-repeat="column in listcolumns">
{{column.title}}
</th>
</tr>
</thead>
</table>
但这不起作用。我没有在屏幕上获取column.title的值,而是将以下太多行添加到DOM中:
<th ng-repeat="column in listcolumns" scope="col" class="ng-scope ng-binding"></th>
答案 0 :(得分:97)
使用属性传递整个对象将不起作用,您必须使用双向绑定。只需将绑定从@
更改为=
,然后修改下面的HTML即可使其正常工作:
更改为指令代码:
// ...
scope: {
listcolumns: "="
},
// ...
更改为模板:
<div linkedlist listcolumns="cashAccountsColumns"></div>
答案 1 :(得分:0)
@ AjayBeniwal的回答是正确的,但我觉得它可以使用一些额外的解释。
当Angular documentation指出(在“隔离指令范围”部分中)时,scope
选项是一个对象,其中包含每个隔离范围绑定的属性。我们使用它将指令内的范围与外部范围分开(隔离),然后将外部范围映射到指令的内部范围。
scope
对象的每个属性的名称对应于指令 isolate scope 属性。在问题的示例中,scope
对象的唯一属性是listcolumns
。因此,创建指令的html也必须有相应的属性:
<div linkedlist listcolumns="cashAccountsColumns"></div>
但scope
属性的名称和指令的属性不需要具有相同的名称。我们可以像这样映射这两个值:
<div linkedlist short-name="cashAccountsColumns"></div>
-
controller: function ($scope) {
$scope.cashAccountsColumns = 'value';
},
scope: {
moreDescriptiveName: "=shortName"
},
对于属性名称与要在指令范围内绑定的值相同的情况,可以使用以下简写语法:
<div linkedlist my-name="cashAccountsColumns"></div>
-
controller: function ($scope) {
$scope.cashAccountsColumns = 'value';
},
scope: {
myName: "="
},
此外,在此示例中,指令的属性值必须与指令外部作用域的属性相对应。这是因为=
中的=shortName
使用从外部作用域到隔离作用域的属性的双向绑定,强制将指令的属性值作为表达式进行求值。正如this answer雄辩地指出的那样,如果我们想要传递一个文字字符串,我们可以使用@
代替=
,或者将指令的isolate范围属性与double和single一起使用引用:
scope: {
moreDescriptiveName: "@"
},
OR
<div linkedlist short-name="'cashAccountsColumns'"></div>