在ng-repeat期间构建AngularJS变量名

时间:2015-04-11 18:26:24

标签: javascript angularjs

我有一组项目如下。 (我无法控制变量的名称)

  

pubDate0,pubDate1,pubDate2

他们是这样访问的

<div>
   <i>
      {{newsData.pubDate0[0]}}
   </i>
</div>
<div>
   <i>
      {{newsData.pubDate1[0]}}
   </i>
</div>
<div>
   <i>
      {{newsData.pubDate2[0]}}
   </i>
</div>

是否有使用ng-repeat连接此变量名称,以便我不必编写所有这些重复代码?

我在ng-repeat内部尝试了以下内容,以及更多类似的组合。

<p ng-repeat="t in getTimes(10) track by $index"> //force looped 10 times
    {{(newsData.pubDate+$index+[0])}}
</p>

//Tried the following as well
{{(newsData.pubDate+$index+[0])}}
{{('newsData.pubDate'+$index+[0])}}
{{('newsData.pubDate'+$index+'[0]')}}
{{newsData.pubDate+$index+[0]}}
{{newsData.pubDate+($index)+[0]}}
{{newsData.pubDate+{{$index}}+[0]}}
{{newsData.pubDate($index)[0]}}
{{newsData.pubDate$index[0]}}
{{newsData.pubDate{{$index}}[0]}}
{{newsData.pubDate+$index+[0]}}

用完了猜测。 :(

2 个答案:

答案 0 :(得分:1)

您有两种方法可以访问js属性:

var obj = {prop1: 'p1', prop2: 'p2'};
console.log(obj.prop1); //p1

var propName = 'prop';
var index = 1;
console.log(obj[propName + index]); //p1

简单地说,使用第二种方式:

newsData['pubDate'+$index][0];

JSFIDDLE

答案 1 :(得分:0)

如果你知道长度,你可以简单地使用new Array(10)看到下面的代码;

//Controller:
$scope.getTimes = function(x) {
   return new Array(x);
}

<p ng-repeat="t in getTimes(10) track by $index"> //force looped 10 times
    {{(newsData['pubDate'+$index][0])}}
</p>

但是我会在解析承诺之前将数据转换为我想要的方式(或者将数据分配给范围),如果你在整个应用程序中使用数据,我肯定会建议。

假设以下代码是您的服务电话;

        var getAllNews = function() {
            var deferred = $q.defer();

            $http.get('/api/news')
            .success(function (resultNews) {
                var pubDates = []; //will be new pubDate array
                for (var key  in resultNews) {
                   //check if it is a pubDate
                   if (key.indexOf("pubDate") === 0) {
                      pubDates.push(resultNews[key]); // add it to array
                      delete resultNews[key]; // remove from the object
                   }
                }
                //finally assign new array as a property of result
                resultNews.pubDates = pubDates;
                deferred.resolve(resultNews);
            });

            return deferred.promise;
        };

但是第二种方法可能会遇到与项目顺序相关的问题,因为浏览器有新的承诺按顺序返回它们(即使它们是)。