使用 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>