1

我有三个指令:

aiOutter、aiMiddle 和 aiInner。

app.directive('aiOutter', function() {
  return {
    restrict: 'A',
    scope: {
      data: '='
    },
    template: '<div>Outter: {{data}}</div>',
    transclude: true,
    link: function(scope, elem, attrs) {
      console.log('outter recognized');
      return console.log('outter data:', scope.data);
    }
  };
}).directive('aiMiddle', function() {
  return {
    restrict: 'A',
    scope: {
      data: '='
    },
    template: '<div>Middle: {{data}}</div>',
    transclude: true,
    link: function(scope, elem, attrs) {
      console.log('middle recognized');
      return console.log('middle data:', scope.data);
    }
  };
}).directive('aiInner', function() {
  return {
    restrict: 'A',
    scope: {
      data: '='
    },
    template: '<div>Inner: {{data}}</div>',
    link: function(scope, elem, attrs) {
      console.log('inner recognized');
      console.log('inner data:', scope.data);
      scope.changeData = function(newData) {
        scope.data = newData;
      }
    }
  };
});

我的标记如下所示:

<body ng-controller="MainCtrl">
    <div ai-outter data="name">
      <div ai-middle data="data">
        <div ai-inner data="data">
        </div>
     </div>
   </div>

只有最外面的指令似乎被选中。我需要做什么才能使用这种继承模式以及能够使用嵌入标记填充最里面的指令?

Plunker:http ://plnkr.co/edit/HvaJKmGH2agEOKHGrZvV

编辑澄清

我按照 PascalPrecht 的建议编辑了我的标记 a(更新后的 plunker 在这里:http ://plnkr.co/edit/HvaJKmGH2agEOKHGrZvV )

<body ng-controller="MainCtrl">
    <div ai-outter data="name" ng-transclude>
      <div ai-middle data="name" ng-transclude>
        <div ai-inner data="name" ng-transclude>
         <h1> Hello, {{name}}</h1>
         <button ng-click="name = 'bob'">Click me</button>
        </div>
      </div>
    </div>

但是,我认为我遇到了范围界定问题。当我按下按钮时,{{name}} 模型应该一直绑定回来,不是吗?目前,只有最里面的范围正在更新。

我认为在涉及指令时我对范围界定感到困惑。

4

2 回答 2

1

你不能使用原始值,你应该从你的范围控制器中引用一个对象。

查看代码的修改版本: http ://plnkr.co/edit/666Adad72zRJIasOzurs?p=preview

并且一定要看看这个出色的答案: AngularJS 中范围原型/原型继承的细微差别是什么?

于 2013-09-14T01:17:44.147 回答
0

您需要ng-transclude在指令模板中指定以告诉角度,将嵌入的内容放在哪里。然后,您可以通过提供一个获取嵌入内容的模板来进行一些链接,其中嵌入内容再次包含一个获取双向绑定数据的指令。

我相应地更新了你的 plunk:http ://plnkr.co/edit/sM3Jnj?p=preview

于 2013-09-13T21:22:23.800 回答