如何访问transcluded元素的范围

时间:2013-12-31 17:56:47

标签: angularjs angularjs-directive

我有一个指令元素。在其中我有一个表单,我想设置一些指令的范围属性。像这样:

 <trans-dir>
    <form role='form' class='form-inline'>
      <div class='form-group'>
        Select Value:
        <label>
          <input type='radio' ng-model='data' value='Val1'>Val1
        </label>
        <label>
          <input type='radio' ng-model='data' value='Val2'>Val2
        </label>
      </div>
    </form>
  </trans-dir>

我对范围的工作方式感到困惑(尽管我已经阅读了很多关于它的内容):

  • 父控制器范围:03
  • 指令控制人:04
  • 指令postLink:04
  • 指令transcludeFn:08

  • 表格范围:05 &lt; ==嗯?

所以,我希望表单设置指令控制器的范围。如果它是相同的范围,那就没问题了。如果它是被转换的范围(08),我可以访问它。没问题。但它是另一个范围 - 05.我可以使用trasnscludedScope遍历它。上一个兄弟,但我真的不知道发生了什么,我不知道这是否合法和确定。

更详细的代码:http://plnkr.co/edit/z70R6W?p=preview

所以我的问题:

  1. 如何访问FORM范围?
  2. 这些范围发生了什么变化?为什么我的表单范围与我的转换范围不同?
  3. 奖金:范围6&amp; 7 ?? (在我的真实项目中,我有大量的范围,我不知道它的来源,而batarang总是说他们没有模型,这不可能永远是真的。)

2 个答案:

答案 0 :(得分:1)

如果没有声明,您的指令将继承其父作用域,因此删除它将简化此操作。

此外,其中一个范围涉及角度:

如果设置&#34;普通变量&#34;在从父母继承范围的子节点中,WON&T; T传播回来 - 它将自己的变量实例化并更新。

$scope.plainString = "derp";
// child will inherit this, but if it gets set in child it will be
// instantiated there as its own variable and won't affect the parent

但是,如果有一个查询作为其中一部分,则该变量将在父级中更改。

$scope.objToQuery = {
    value: "derp"
};
// child will inherit this, and when it gets changed there
// e.g. ng-model="objToQuery.value"
// it WILL be changed in the parent

这个对象是你&#34;查询&#34;必须存在于父范围内。

查看此修改过的plunkr:http://plnkr.co/edit/SftstP7L2OJnfLka8OLd?p=preview

这有帮助吗?

答案 1 :(得分:1)

如果您使用ng-transclude,则无需手动拨打transcludeFn。当您手动调用它时,您将创建#8范围。它由ng-transclude自动调用以创建#5。因此,表单范围转换范围,而不是您手动创建的范围(这就是为什么它没有设置$ watch)。我不确定是否有办法访问ng-transclude创建的自动生成的转化范围。但是,您可以不使用ng-transclude,而是手动调用transcludeFn(就像您已经在做的那样)并手动将克隆元素附加到DOM中。