AngularJS:有没有比指定的更好的方法来实现这个目标?

时间:2015-03-12 16:41:46

标签: javascript html angularjs twitter-bootstrap dry

我使用生成Bootstrap选项卡布局的模板。如下所示:

<div class="a">
    <ul class="nav nav-bar nav-stacked" role="tabs">
        <li><a href="#home"></a></li>
        ...
    </ul>
    <div class="tab-content">
        <div id="home">abc</div>
        ...
    </div>
</div>

现在这是一个非常简单明了的标签导航,可以硬编码并实现。

我在ng-repeat ul's和标签内容li上有动态div

我从REST服务获得的JSON包含选项卡的数据以及要在单个对象内的选项卡内容中显示的内容。例如:

{
    "0": "a": [{ // a- tab data
                   "0": "abc", // abc - data to be displayed inside the tab-content
                   "1": "xyz"
               }]
  ...
}

使用这样的JSON层次结构,我基本上需要两次ng-repeat。一次用于ul li,一次用于标签内容,因为标签的每个对象都包含与其相关的数据。

所以我到目前为止所做的是:

<div class="a">
    <ul class="nav nav-bar nav-stacked" role="tabs">
        <li ng-repeat="foo in data"><a href="#home">{{foo.name}}</a></li>
        ...
    </ul>
    <div class="tab-content">
        <div id="home" ng-repeat="foo in data">
            <p ng-repeat="f in foo.desc">{{f}}</p>
        </div>
        ...
    </div>
</div>

编辑: 所以我的问题是,有一种更聪明的方法可以使用单个ng-repeat来实现这一点,而不是两次使用“foo in data”吗?

很抱歉,如果我的问题不明确。

1 个答案:

答案 0 :(得分:1)

ng-include$templateCache而不是ng-repeat一起使用。例如:

&#13;
&#13;
var app = angular.module('foo', []);

function foo($templateCache)
  {
  var model = 
    {"data":
     [
       {"name": "Stack",
        "desc": ["Exchange", "Overflow"]
       }
     ]
    },
    cursor, i, bar = baz = "";
  
  for (i = 0; i < model.data.length; i++)
  	{
    bar = bar.concat("<li>", model.data[i].name,"</li>");
    baz = baz.concat("<li>", model.data[i].desc.join().replace(/,/g,"</li><li>") );
    }
  
  $templateCache.put('name', bar);
  $templateCache.put('desc', baz);      
  }

app.run(foo);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="foo">
  <ul ng-include="'name'"></ul>
  <ul ng-include="'desc'"></ul>
</div>
&#13;
&#13;
&#13;

<强>参考