Angularjs ng模型作为二维数组中的变量

Angularjs ng模型作为二维数组中的变量,angularjs,Angularjs,我有一小段代码,我希望这个小文本输入框与矩阵[I][u]相关联。我知道我可以使用ng model=使文本框与某个变量相关联 但是,我希望它是双向的-更改变量将更改文本框值,更改文本框值将更改变量。然而,当我在输入文本框上有ng model时,我似乎无法编辑它的值,因为它总是“重置”为默认值 我知道我可以使用ng change,但我的中间一行是这样的: $scope.matrix = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; 调用$scope.update()函数

我有一小段代码,我希望这个小文本输入框与
矩阵[I][u]
相关联。我知道我可以使用
ng model=
使文本框与某个变量相关联

但是,我希望它是双向的-更改变量将更改文本框值,更改文本框值将更改变量。然而,当我在输入文本框上有
ng model
时,我似乎无法编辑它的值,因为它总是“重置”为默认值

我知道我可以使用
ng change
,但我的中间一行是这样的:

$scope.matrix = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];

调用$scope.update()函数也不起作用。我仍然无法编辑文本框值

tl;dr:我怎样才能拥有一个带有
ng模型的文本框,并允许编辑它来编辑ng模型上的文本框值和变量。

这样使用:

<input type="text" style="width: 20px; text-align: center;" ng-model="column" ng-change="update">

例如:


它不是很优雅,但正在发挥作用。

这里有一个指导性的方法,更有趣一点:

<input type="text" ng-model="matrix[$index][$parent.$index]" style="width: 20px; text-align: center;" />
app.directive(“矩阵”,函数($compile){
返回{
范围:{
ngModel:“=”
},
限制:“E”,
链接:功能(范围、元素、属性){
var render=function(){
var模板=”;
scope.ngModel.forEach(函数(行,r){
模板+=“”;
console.log(scope.ngModel[r]);
row.forEach(函数(列,c){
模板+='';
});
模板+=“

”; }); html(模板); $compile(element.contents())(范围); } render(); 范围:$watch('ngModel',render,true); } } });
可以使用哪个

只是因为我爱你。在此处运行:

使用

app.directive("matrix", function($compile){
 return{
 scope:{
   ngModel:'='
 },
 restrict:"E",
 link:function(scope, element, attributes){
   var render = function(){
    var template="";
    scope.ngModel.forEach(function(row, r){
      template+="<p>";
      console.log(scope.ngModel[r]);
      row.forEach(function(column, c){
        template+='<span><input style="width: 20px; text-align: center;" ng-model="ngModel['+r+']['+c+']"></span>';
      });
      template+="</p>";
    });
    element.html(template);
    $compile(element.contents())(scope);
  }
  render();
  scope.$watch('ngModel', render, true);
 }
}
});
作为输入标记中的
ng:model

row[$index]

之所以这样做有效并且使用
不起作用,是因为
标记将通过复制父作用域来创建子作用域。但是
是一个简单的/标量变量。这样的变量实际上只是被复制。因此,您将在
ng:model
中得到一个副本,该副本未连接到矩阵中的实变量。这就是为什么AngularJS的人强调你应该总是有一个由
ng model
引用的内部带有点的东西

另一方面,
仍然是一个复杂变量(数组),而不是标量。JavaScript不是通过创建真正的副本而是通过复制对数据的引用来“复制”这样的变量。因此,您将得到对相同数据的第二个引用。因此,由
标记创建的子范围中的
仍然连接到矩阵中的原始行数据,双向数据绑定将起作用


再次强调这一点:不要使用没有点的东西,如
ng:model
。AngularJS过去在他们的网页上有这样做的坏例子,但看起来他们大部分/全部都被改变了。但正如您在本例中所看到的,一些
foo[5]
也是可以的,因为它仍然引用一个复杂变量
foo[“bar”]
实际上等于
foo.bar

我现在发现,但根据这一点,我的也应该有效。我在那个问题/答案中没有看到任何东西表明你的解决方案应该有效。这里的问题是,每个
ng repeat
都会创建一个子作用域,如果最终处于变量的“标量”级别,则会创建与其父级断开连接的变量。请再次参阅:此处所写和显示的内容不适用。这个问题并没有说明你的代码应该是有效的,一个代码之所以有效,是因为那些是对象,而你只得到了int。如果你有实际的对象,这将在没有$index或任何东西的情况下工作。我怀疑
行[$index]
也会工作。另外:你的两个指数不是顺序不对吗?后一个索引是“内部”索引,所以它不应该是
矩阵[$parent.$index][$index]
?不,你实际上证明了我的观点。第一个参数
[0]
明确引用外部数组,第二个参数
[2]
引用内部数组。因此,结果是2。因此它是
[outer][internal]
,因此需要是
[$parent.$index][$index]
,因为父索引是这里的外部数组。感谢您证明我的怀疑。这实际上是有道理的。让我解释一下:这里的事情是,在内部循环中,我们以一个标量变量(
)结束,当内部
ng:repeat
设置范围时,它刚刚被复制。在外部
ng:repeat
这不是一个问题,因为
仍然不是一个标量变量,而是一个复杂的对象(数组),它将通过引用进行复制,因此副本不会与原始副本断开连接。@kju,可能是我累了,但我没有发现任何错误:这是因为您的输出代码也交换了两个索引。尝试只输出
{{matrix}}
,您将看到。
row[$index]
<input type="text" ng-model="row[$index]" style="width: 20px; text-align: center;" />