指令中的范围
Scope in directives
我对指令、作用域和数组有问题。我读到的是,如果我写一个指令,其中作用域设置为true,我会得到一个与父作用域分离的新作用域。在这里,您可以看到我的示例中的两个指令。我的每个阵列一个。
kdApp.directive('kdinsurancesituationamount', function kdinsurancesituationamount() {
return {
restrict: 'E',
scope: true,
template: "<span>Name </span> " +
"<input value='{{name1}}' ng-model='name1'>" +
"<div ng-repeat='isa in insuranceSituationAmountList1'>" +
"<span>Amount {{$index}} </span> " +
"<input value='{{isa}}' ng-model='isa'>" +
" <br /></div>"
};
});
kdApp.directive('kdinsurancesituationamount2', function kdinsurancesituationamount2() {
return {
restrict: 'E',
scope: true,
template: "<span>Name </span> " +
"<input type='text' maxlength='9' value='{{name2}}' ng-model='name2'>" +
"<div ng-repeat='isa in insuranceSituationAmountList2'>" +
"<span>Index {{$index}} </span> " +
"<input type='text' maxlength='9' value='{{isa.amount}}' ng-model='isa.amount'>" +
" <br /></div>"
};
});
当我有像$scope.name1="John"这样的变量时,它工作得很好,但当我有数组时,我不明白它是如何工作的。请在此处查看我的控制器。我有两个不同的例子,insuranceSituationAmountList1和insuranceCituationAmoountList2。它们的工作方式不同。使用ng repeat,我在输入标记中写出数组,每个输入标记也有一个ng模型属性。
kdApp.controller('InsuranceSituationAmountController', function ($scope) {
$scope.insuranceSituationAmountList1 = ["1000", "2000", "3000"];
$scope.insuranceSituationAmountList2 = [{
amount: "4000"
}, {
amount: "5000"
}, {
amount: "6000"
}];
$scope.name1 = "John";
$scope.name2 = "John";
});
即使我在指令中将作用域设置为false,数组insuranceStateAmountList1也永远不会更新父作用域。但对于域名1,它按我的意愿运行。当scope为false时,字段名称1会更新父作用域,而当scope设置为true时则不会。
即使我在指令中将作用域设置为true,数组insuranceStateAmountList2也将始终更新父作用域。但对于域名2,它可以随心所欲。当scope为false时,字段名称2会更新父作用域,而当scope设置为true时则不会。
我有一个jsfiddle,你可以在那里看到它是如何工作的http://jsfiddle.net/uhlrog/Lzcqeruw/66/因此,如果您有时间测试它,首先使用scope:true并更改为scope:false,然后更改输入框中的内容。
我想这是我不理解的基本问题,但有人能为我解释为什么我的数组不能很好地工作吗。
(正如你所读到的,我的第一语言不是英语;-)
好的。。
首先你需要了解这个基本原理:
当"获取"范围值angular时,它将在层次结构中向上导航,直到找到为止。但是,当"设置"属性时,它只会将其放置在当前作用域上。(这是基于javascript继承的工作方式,而不是angular的错误,所以不要责怪他们。)
所以…'例如,获取"{{name}}"将向上导航,直到找到具有名称的$scope并将其显示。但是"setting"{{name="Changed"}不会设置该作用域的值。。它将把它设置在第一个可用的作用域上。。
然而…'获取"{{object.name}}"将向上导航作用域,直到找到一个名为object的对象,然后显示其名称属性,而"设置"{{object.name="Changed"}将首先需要"获取"object"(通过向上导航范围的层次结构),然后设置其属性。将在$scope"对象"所在的任何位置更新。
现在,如果你理解了这一点,它可能有助于解释发生了什么,这就是为什么ng repeat在指令的第二个版本中更新了正确的值。
现在,在第一个指令中,我可以理解为什么当您将scope设置为false时,会出现相反的情况,这令人困惑。。这是因为现在ng model="name1"与其父级在同一范围内,并直接更新(没有$scope层次结构),但也要记住,ng repeat确实创建了一个范围!。因此,因为数组值不包含在对象中,所以只在单个ng重复作用域上更新。
使用此css查看作用域:
.ng-scope {
border: 1px red solid;
}
我知道我可能没有很好地解释这一点(尤其是如果你提到的英语不是你的第一语言),但希望更新的小提琴会有所帮助。。
突出问题并修复问题
这有助于记住,如果您使用没有"的ng模型(点),则该值将仅在其最近的范围内更新。
更新时间:如果您不理解我的尝试
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- AngularJS:带有HTML和angular表达式的指令;编译”;具有外部范围的内容
- AngularJS指令范围约束问题重复出现
- 在 Angular 指令中,如何进行回调,其中函数名称位于父范围的变量中
- 对于使用传递的数据计算的局部范围变量,角度绑定在自定义指令中不起作用
- AngularJS:从控制器访问特定的指令范围
- AngularJS:从指令设置范围变量
- AngularJS在指令模板中修改范围
- 基于范围数据更改指令模板中的元素
- 如果指令包含在另一个指令中,我如何在隔离范围内添加双向数据绑定属性
- 日期-时间范围指令字段未显示任何值
- 从父控制器传递工厂数据以隔离范围指令
- 从子元素访问范围指令
- AngularJS在父级和子级范围指令之间共享数据
- 隔离范围指令会导致业力错误
- 范围$指令中的watch't在AJAX请求后被调用
- 如何在AngularJS中对隔离范围指令进行单元测试
- AngularJS隔离范围指令
- 从隔离范围指令中的更改更改控制器变量值
- 美元的范围.指令中的项未定义