我对指令、Scopes和数组有问题。我所读到的是,如果我编写了一个将作用域设置为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和insuranceSituationAmountList2。他们的工作方式也不一样。对于ng-重复,我在输入标签中写出数组,每个输入标记都有一个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,数组insuranceSituationAmountList1也不会更新父作用域。但是对于字段name1,它的工作方式是我想要的。当作用域为false字段时,name1更新父作用域,而当作用域设置为true时,则不会。
即使我在指令中将作用域设置为true,数组insuranceSituationAmountList2也将始终更新父作用域。但是对于字段name2,它的工作方式是我想要的。。当作用域为false字段时,name2更新父作用域,而当作用域设置为true时,则不会。
我有一个手动操作,您可以看到它是如何工作的,因此,如果您有时间测试它,首先使用作用域: true和change :false,并在输入框中更改内容。
我想这是一些基本的东西,我不明白,但是有人能为我解释为什么我的数组不能很好地工作。
(如你所知,我的第一种语言不是英语;-)
发布于 2014-09-09 06:42:59
好的..。
首先,您需要理解这个基本原则:
当“获取”范围值时,角将导航到层次结构上,直到它找到它。但是,当“设置”属性时,它只会将其放在当前范围内。(这是基于javascript继承的工作方式,而不是角的错误,所以不要责怪他们。)
所以..。例如,“获取”{ name }将导航到找到一个带有名称的$scope并显示它。但是“设置”{{ name =“已更改”}}将不设置该作用域上的值。它将把它设置在第一个可用范围上。
但是..。“获取”{ object.name }将沿着作用域向上导航,直到它找到一个名为object的对象,然后显示它的名称属性,并且“设置”{ object.name = 'Changed‘}}将首先需要“get”" object“(通过在作用域的层次结构上导航),然后设置它的属性。它将在任何$scope "object“上更新。
现在,如果您理解这一点,它可能有助于解释发生了什么,这就是为什么ng-重复正在更新指令的第二个版本中的正确值。
现在,在第一个指令中,我可以理解为什么当您将范围设置为false时出现了相反的情况。这是因为现在ng-model="name1“与它的父级在同一个作用域上,并且直接更新(没有$scope层次结构),但是也要记住,ng-重复确实创建了一个作用域!因此,由于数组值不包含在对象中,所以只对单个ng重复作用域进行更新。
使用此css查看作用域:
.ng-scope {
border: 1px red solid;
}
我知道我可能不会很好地解释这一点(尤其是如果英语不是你的第一语言,正如你提到的那样),但希望一个更新的小提琴会有帮助。
它有助于记住,如果您使用ng-模型而没有“.”(点)那么,该值只会在其最近的作用域上更新。
更新:如果您不理解我的尝试,这篇文章可以用图表突出这个问题。
https://stackoverflow.com/questions/25746881
复制