使用 ng-transclude 将作用域强制命名为插槽
Force scope to named slot with ng-transclude
我有一个指令如下:
<selectable-item-list items="model.items">
<item-template>
<span ng-bind="item.text"></span>
</item-template>
</selectable-item-list>
问题出在 <item-template>
,其中 item
将是 当前迭代项 的引用,当内部 ng-repeat
绑定时<selectable-item-list>
里面。
AFAIK,似乎嵌入看不到指令的范围,因此,item.text
无法绑定,因为根本没有 item
。
你会如何解决这种情况? 以前我是手动转译 <item-template>
但另一种方法有其他 downsides/issues.
这是一个可运行的代码片段,作为我的真实案例的示例:
var app = angular.module("app", []);
app.controller("some", function() {
this.items = [{
text: "hello"
}, {
text: "bye"
}];
});
app.directive("test", function() {
return {
template: `<ol>
<li ng-repeat="item in items">
<div ng-transclude="itemTemplate"></div>
</li>
</ol>`,
transclude: {
"itemTemplate": "itemTemplate"
},
scope: {
"items": "="
}
}
});
<script src="https://code.angularjs.org/1.5.7/angular.js"></script>
<div ng-app="app" ng-controller="some as some">
<test items="some.items">
<item-template>
<span ng-bind="item.text"></span>
</item-template>
</test>
</div>
我有一个错误的假设!当我说嵌入的内容无法访问包含的指令范围时,我错了,因为其他问答:Why ng-transclude's scope is not a child of its directive's scope - if the directive has an isolated scope? 绝对过时了。
事实上,作为同一个问答的一部分,还有另一个答案,其中有人描述说现在这个问题已经得到修复,transcluded content can access its direct directive scope using $parent
。
所以我解决了我的问题,只是将 item
属性 访问权限替换为 $parent.item
并且成功了!
我添加了一个具有此修复的工作代码片段:
var app = angular.module("app", []);
app.controller("some", function() {
this.items = [{
text: "hello"
}, {
text: "bye"
}];
});
app.directive("test", function() {
return {
template: `<ol>
<li ng-repeat="item in items">
<div ng-transclude="itemTemplate"></div>
</li>
</ol>`,
transclude: {
"itemTemplate": "itemTemplate"
},
scope: {
"items": "="
}
}
});
<script src="https://code.angularjs.org/1.5.7/angular.js"></script>
<div ng-app="app" ng-controller="some as some">
<test items="some.items">
<item-template>
<span ng-bind="$parent.item.text"></span>
</item-template>
</test>
</div>
我有一个指令如下:
<selectable-item-list items="model.items">
<item-template>
<span ng-bind="item.text"></span>
</item-template>
</selectable-item-list>
问题出在 <item-template>
,其中 item
将是 当前迭代项 的引用,当内部 ng-repeat
绑定时<selectable-item-list>
里面。
AFAIK,似乎嵌入看不到指令的范围,因此,item.text
无法绑定,因为根本没有 item
。
你会如何解决这种情况? 以前我是手动转译 <item-template>
但另一种方法有其他 downsides/issues.
这是一个可运行的代码片段,作为我的真实案例的示例:
var app = angular.module("app", []);
app.controller("some", function() {
this.items = [{
text: "hello"
}, {
text: "bye"
}];
});
app.directive("test", function() {
return {
template: `<ol>
<li ng-repeat="item in items">
<div ng-transclude="itemTemplate"></div>
</li>
</ol>`,
transclude: {
"itemTemplate": "itemTemplate"
},
scope: {
"items": "="
}
}
});
<script src="https://code.angularjs.org/1.5.7/angular.js"></script>
<div ng-app="app" ng-controller="some as some">
<test items="some.items">
<item-template>
<span ng-bind="item.text"></span>
</item-template>
</test>
</div>
我有一个错误的假设!当我说嵌入的内容无法访问包含的指令范围时,我错了,因为其他问答:Why ng-transclude's scope is not a child of its directive's scope - if the directive has an isolated scope? 绝对过时了。
事实上,作为同一个问答的一部分,还有另一个答案,其中有人描述说现在这个问题已经得到修复,transcluded content can access its direct directive scope using $parent
。
所以我解决了我的问题,只是将 item
属性 访问权限替换为 $parent.item
并且成功了!
我添加了一个具有此修复的工作代码片段:
var app = angular.module("app", []);
app.controller("some", function() {
this.items = [{
text: "hello"
}, {
text: "bye"
}];
});
app.directive("test", function() {
return {
template: `<ol>
<li ng-repeat="item in items">
<div ng-transclude="itemTemplate"></div>
</li>
</ol>`,
transclude: {
"itemTemplate": "itemTemplate"
},
scope: {
"items": "="
}
}
});
<script src="https://code.angularjs.org/1.5.7/angular.js"></script>
<div ng-app="app" ng-controller="some as some">
<test items="some.items">
<item-template>
<span ng-bind="$parent.item.text"></span>
</item-template>
</test>
</div>