ng-repeat无法识别对模型的更新

时间:2014-11-28 03:08:30

标签: javascript angularjs

我无法迭代我正在更新的模型的值。我有以下控制器

app.controller('VariantsController', ['$http', function($http){
    var ctrl = this;
    this.cars = []; // I get the cars eventually ...
    this.selected_car = null;

this.selectCar = function(car){
      ctrl.selected_car = car;
    }

当用户点击网页上的“汽车”时,我会更新控制器的selected_car。页面会相应更新以显示所选汽车的名称,但ng-repeat不会迭代selected_car的属性。

以下是相关的html(variants是控制器的别名):

<div ng-show="variants.selected_car">
  <h6>{{variants.selected_car.name}}</h6> <!-- Updates without problem -->
  <table class="table">
    <tr ng-repeat="(key,val) in variants.selected_car.specs"> <!-- Problem! Does not iterate -->
      <td>{{key}}</td>
      <td>{{val}}</td>
    </tr>
  </table>
</div>

我调查了这个:AngularJS: ng-repeat list is not updated when a model element is spliced from the model array但是接受的回答是“每当你在angularjs之外做某种形式的操作时......”。在这种情况下,我正在从控制器内更新模型,所以它不应该是一个问题。另外,当我没有明确使用$apply时,如何在这种情况下使用$scope

selected_car.specs是一个有很多键的对象:

{
   ...
   mileage: 13.53,
   mileage_city: 23,
   mileage_highway: 32,
   power: 220,
   ...
}

Plunker(@Phil礼貌):http://plnkr.co/edit/ULSr2Tk5D7phTYW0t7Ys?p=preview

2 个答案:

答案 0 :(得分:1)

检查您的数据是否正确。访问对象可能有问题。尝试打印您的对象variants.selected_car.specs。我为演示创建了一个plunker来打印键值表。

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.3.x" src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.4/angular.min.js" data-semver="1.3.4"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>
    <table>
      <tr ng-repeat="(key, val) in {name:'John', age:25, gender:'boy'}">
        <td>{{key}}</td>
        <td>{{val}}</td>
      </tr>
    </table>
  </body>

</html>


var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
  $scope.obj={name:'John', age:25, gender:'boy'}
});

答案 1 :(得分:1)

啊哈,它的长度&#34;!

我认为ng-repeat尝试使用length属性进行迭代,以及你的长度&#34;属性导致它不正确地迭代或根本不迭代。

要解决此问题,我要选择其他属性名称。也许&#34; body_length&#34;或类似的东西。

Demo