AngularJS控制器范围与指令范围?

时间:2017-06-10 15:33:31

标签: angularjs

请参阅plunker或以下代码

中的此AngularJS示例

我的第一个问题:
在第40行的accordion指令中,为什么范围变量“expandders”在最初在第20行的SomeController中初始化之后重新初始化为空数组,如下所示{?1}}?

我的第二个问题:
为什么他们通过第70和74行的指令范围而不是元素?

如下:

  • 第70行:var expanders = [];

  • 第74行:accordionController.addExpander(scope);

我的第三个问题: 我将所有代码从手风琴控制器移动到扩展器指令的链接功能,应用程序仍然100%工作,为什么他们在父手风琴指令上构建扩展器阵列,如果他们可以在扩展器的链接功能中构建它?请参阅此新plunk

accordionController.gotOpened(scope);
.expander {
  border: 1px solid black;
  margin: 1px;
  width: 250px;
}

.expander > .title {
  background-color: black;
  color: white;
  padding: .1em .3em;
  cursor: pointer;
}

.expander > .body {
  padding: .1em .3em;
}

1 个答案:

答案 0 :(得分:1)

`$scope.expanders` is only visible in the scope of `SomeController`

而指令中的var expander是指令自身的局部变量。 不要混淆他们两个。把它拿走,因为它们彼此无关。

<body ng-controller='SomeController' >
    <accordion>
      <expander class='expander'
                ng-repeat='expander in expanders' <!-- expanders here refers to $scope.expanders in SomeController that has some data in it -->
                expander-title='expander.title'>
        {{expander.text}}
      </expander>
    </accordion>
</body>

回答问题2

因为他们将扩展器的标题传递给addExpander()函数。

scope: { title:'=expanderTitle' }。他们已经定义了这样的范围 expander directivescope已经title

回答问题3

这是一般和首选的做法。你不能(不应该)将所有东西都放在一个函数中。