我有一个指令,其中一个列表(数组)的项目通过控制器的范围传入指令的范围,从而指令的模板可以访问这些项目。
我希望将项目列表传递给指令(然后在链接函数中使用),然后不能通过指令模板直接访问。
即。如果我们有以下指令:
directive('itemList', function(){
return {
scope: {
items: '='
}
link: function(scope, elem, attrs){
var item-list = scope.items;
// ... want to manipulate first ...
}
}
})
变量scope.items现在可用于该指令使用的任何模板。虽然我不希望这种情况发生,并希望将某些内容传递给指令,而不会让范围知道。这可能吗?
答案 0 :(得分:1)
由于指令范围几乎是定义范围是指令模板使用的范围,因此我没有看到以严格的信息隐藏方式执行此操作的任何明显方法。但是,为什么不只是为传递的范围变量使用不同的名称以及模板绑定到什么?例如,如果您说scope: { myPrivatePassedItems: '=items' }
,则现在可以根据需要使用scope.myPrivatePassedItems
,然后再将其设置为scope.items
。使用这种方法,指令的使用和指令模板中的HTML只能看到" items",但在内部你的指令有自己的"私有"变量
我应该补充一点,上面是从使用者到指令模板的单向数据流所需的简单更改。如果您还需要更新原始项目数组,则还需要在完成初始设置后在scope.$watch
阵列上添加scope.items
。然后,您需要将这些更改(可能需要修改)返回到scope.myPrivatePassedItems
,以便更新使用者的数组。
答案 1 :(得分:1)
您可以使用$parse
service来检索值而不使用scope: {}
,但是您将失去使用scope: { items: '=' }
所固有的双向数据绑定。正如Dana Cartwright所提到的,如果你需要2路绑定,你必须手动设置它。
directive('itemList', function($parse){
return {
link: function(scope, elem, attrs){
var itemList = $parse(attrs['items'])(scope);
// do stuff with itemList
// ...
// then expose it
scope.itemList = itemList;
}
};
});