Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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
Javascript 在ng repeat内修改角度范围内的对象_Javascript_Angularjs_Angularjs Ng Repeat - Fatal编程技术网

Javascript 在ng repeat内修改角度范围内的对象

Javascript 在ng repeat内修改角度范围内的对象,javascript,angularjs,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Ng Repeat,我正在用HTML创建一个表单,使用ng repeat从作用域中的一个对象生成表单元素。我还使用该对象生成ng repeat之外的其他元素 HTML中的简化示例如下所示: <div ng-app="App"> <div ng-controller="Ctrl"> <div class="block1"> <form ng-repeat="(key, value) in test"> &l

我正在用HTML创建一个表单,使用ng repeat从作用域中的一个对象生成表单元素。我还使用该对象生成ng repeat之外的其他元素

HTML中的简化示例如下所示:

<div ng-app="App">
  <div ng-controller="Ctrl">
      <div class="block1">
          <form ng-repeat="(key, value) in test">
              <label>{{key}}</label>
              <input ng-model="value" />
              <p>{{value}}</p>
          </form>
      </div>
      <div class="block2">
        <p>
          {{test.a}}
        </p>
        <p>
            {{test.b}}
        </p>
      </div>
  </div>
</div>
在此示例中,区块2中的文本设置为
test.a
test.b
的初始值。循环内的输入值和
值也设置为初始值

当我修改输入中的值时,ng repeat块中的
值正确更新,但块2中的
标记无法更新

为什么会有这种行为?ng repeat是否创建自己的隔离作用域?如果是的话,我怎样才能更新控制器级别的作用域?还有,有人能解释一下这种行为背后的想法和它提供的任何好处吗

试试这个:

    angular.module('App', []);

function Ctrl($scope) {
    $scope.test = [
        {label:"a", value:"abc"},
        {label:"b", value:"def"}
    ]
}


{{o.label}}
{{o.value}}

{{test[0]。value}}

{{测试[1]。值}

Angularjs使用对象是通过引用传递的事实。因此,如果将对象传递给函数并更改函数内部的对象,则函数外部的对象也会更改。
查看此更新的

ng repeat
为每个重复项创建一个子范围。因此,您试图将原语传递给子作用域,而子作用域不会创建对父作用域的引用。但是,当传递对象时,传递的是原始对象引用

来自Angular一位父亲的口中:

在ng模型中始终有一个点

由Angular creator提供(2012/12/11)。请转至第31分钟,了解有关此确切情况的详细说明

将数据修改为对象数组:

$scope.test = [{ val:"abc",key:'a'}, {val:"def",key:'b'} ]
然后在中继器中:

<form ng-repeat="item in test">
  <label>{{item.key}}</label>
  <input ng-model="item.val" />
  <p>{{item.val}}</p>
</form>

{{item.key}
{{item.val}}


感谢您对该行为的清晰解释。我的用例要求我在外部作用域中按名称引用“test”的属性,因此数组对我不起作用,但子对象似乎可以正常工作。我的对象键是UNIX时代的,所以这对我来说非常困难me@neaumusic评论不清楚,如果需要帮助,请发布问题
$scope.test = [{ val:"abc",key:'a'}, {val:"def",key:'b'} ]
<form ng-repeat="item in test">
  <label>{{item.key}}</label>
  <input ng-model="item.val" />
  <p>{{item.val}}</p>
</form>