Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS控制器范围与指令范围?_Angularjs - Fatal编程技术网

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

AngularJS控制器范围与指令范围?,angularjs,Angularjs,请参考下面代码中的AngularJS示例 我的第一个问题: 在第40行的accordion指令中,为什么范围变量“expanders”重新初始化为空数组,如下所示var expanders=[]最初在第20行的SomeController中初始化后 我的第二个问题: 为什么他们在第70行和第74行通过了指令范围而不是元素 详情如下: 第70行:accordionController.addExpander(范围) 第74行:accordionController.gotOpen(范围) 我的

请参考下面代码中的AngularJS示例

我的第一个问题:
在第40行的accordion指令中,为什么范围变量“expanders”重新初始化为空数组,如下所示
var expanders=[]最初在第20行的SomeController中初始化后

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

详情如下:

  • 第70行:
    accordionController.addExpander(范围)

  • 第74行:
    accordionController.gotOpen(范围)

我的第三个问题: 我将所有代码从accordion控制器移动到expander指令的link函数,应用程序仍然100%工作,为什么他们在父accordion指令上构建expander数组,如果他们可以在expander的link函数中构建它呢?请参考这个新的

.expander{
边框:1px纯黑;
保证金:1px;
宽度:250px;
}
.expander>.title{
背景色:黑色;
颜色:白色;
填充:.1em.3em;
光标:指针;
}
.expander>.body{
填充:.1em.3em;
}

手风琴
{{expander.text}
功能控制器($scope){
$scope.expanders=[
{title:'单击我展开',
文字:“嗨,各位,我是隐藏的内容,但现在显示出来了。”,
{title:'单击此',
文字:“我比你以前看到的文字还要好”},
{title:'不,单击我!',
文本:“我是在看到其他文本之前应该先看到的文本”}
];
}
var appModule=angular.module('appModule',[]);
指令('accordion',函数(){
返回{
限制:“EA”,
替换:正确,
是的,
模板:“”,
控制器:函数(){
变量扩展器=[];
this.gotOpened=函数(selectedExpander){
角度.forEach(扩展器,函数(扩展器){
如果(选择expander!=扩展器){
expander.showMe=false;
}
});
}
this.addExpander=函数(扩展器){
扩张器。推(扩张器);
}
}
}
});
指令('expander',function(){
返回{
限制:“EA”,
替换:正确,
是的,
要求:“^?手风琴”,
作用域:{title:'=expanderTitle'},
模板:“”+
“{{title}}”+
'' +
'',
链接:函数(范围、元素、属性、accordionController){
scope.showMe=false;
accordionController.addExpander(范围);
scope.toggle=函数toggle(){
scope.showMe=!scope.showMe;
accordionController.GotOpen(范围);
}
}
}
});
指令中的
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>


请在你的问题中嵌入你的plunkr中的相关代码。是的,我认为你是对的,这是两个不同的东西,但名称相同。但是为什么在expander指令中,他们使用expander作用域来构建模型扩展器,而不是链接参数中的元素呢。请将其标记为绿色勾号(已接受)。如果您觉得答案有用,谢谢,但是当我打印指令的范围时,它会给我一个完整的对象,而不仅仅是一个简单的模型,例如标题。而且范围对象只包括标题,而不包括主体部分。为什么?@SamirTaha在使用expander.title时,您只传递title属性,当您查看作为对象的作用域本身时,您在指令的作用域中定义的属性是作用域对象的目标属性,作用域对象具有与之关联的其他方法,用于触发摘要以更新视图(通过作用域.$apply())以及清理和处理作用域上事件所需的其他内容。有关所有详细信息,请参阅$rootScope文档。
<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>