【发布时间】:2015-11-30 20:56:40
【问题描述】:
我在 AngularJS 1.2.28 中有一个单页应用程序,我正在努力让它在 IE8 中正常工作。
特别是我有一个嵌套ng-repeats 的问题,用于显示在以下MainController 中声明的bigObject:
angular.module('singlePageApp')
.controller('MainController',
['$scope',
function ($scope) {
$scope.showLittleObjectsList = false;
$scope.bigObject = {
objects: [
{
name: "NAME1",
metadata: [
{index: 0, desc: "metadataQ"},
{index: 0, desc: "metadataF"},
{index: 1, desc: "metadataZ"},
{index: 1, desc: "metadataL"}
]
},
{
name: "NAME2",
metadata: [
{index: 0, desc: "metadataH"},
{index: 0, desc: "metadataX"}
]
},
{
name: "NAME3",
metadata: [
{index: 0, desc: "metadataU"},
{index: 1, desc: "metadataG"},
{index: 2, desc: "metadataS"},
]
},
{
name: "NAME4",
metadata: [
{index: 0, desc: "metadataK"},
{index: 1, desc: "metadataR"},
{index: 1, desc: "metadataW"},
{index: 2, desc: "metadataN"},
{index: 2, desc: "metadataC"}
]
}
]
};
}]);
主要的 HTML 块是这样的(请注意,showLittleObjectsList = false; 在控制器的开头,仅用于向用户显示列表):
<div ng-repeat="littleObject in bigObject.objects | orderBy:'name':false">
<div>
<button type="button" class="btn btn-default btn-sm" ng-click="showLittleObjectsList = !showLittleObjectsList">
<span class="glyphicon glyphicon-chevron-right" ng-hide="showLittleObjectsList"></span>
<span class="glyphicon glyphicon-chevron-down" ng-show="showLittleObjectsList"></span>
</button>
<span>{{littleObject.name}}</span>
</div>
<div ng-show="showLittleObjectsList">
<div>
<div ng-include="'path/to/singledata/template.html'"></div>
</div>
</div>
</div>
单个数据的template.html是这样的(groupBy过滤器属于angular-filter):
<div ng-repeat="(key, metadata) in littleObject.metadata | groupBy:'index'">
<div ng-show="$first">
<strong>
Metadatum desc
</strong>
</div>
<div ng-repeat="metadatum in metadata">
<div>
{{metadatum.desc}}
</div>
</div>
</div>
所有这些代码在 Chrome、Firefox 甚至 IE11 中都运行良好,给了我这样的东西(以前的 v 用于插入符号,因为 showLittleObjectsList = true;):
v NAME1
________________________________________
| Metadata desc: |
| metadataA |
| metadataF |
| metadataZ |
| metadataL |
|_______________________________________|
v NAME2
________________________________________
| Metadata desc: |
| metadataH |
| metadataX |
|_______________________________________|
v NAME3
________________________________________
| Metadata desc: |
| metadataU |
| metadataG |
| metadataS |
|_______________________________________|
v NAME4
________________________________________
| Metadata desc: |
| metadataK |
| metadataR |
| metadataW |
| metadataN |
| metadataC |
|_______________________________________|
遗憾的是,在 IE8 中,最里面的 ng-repeat 坚持使用第一个 littleObject 的元数据,给了我这样的信息:
v NAME1
________________________________________
| Metadata desc: |
| metadataA |
| metadataF |
| metadataZ |
| metadataL |
|_______________________________________|
v NAME2
________________________________________
| Metadata desc: |
| metadataA |
| metadataF |
| metadataZ |
| metadataL |
|_______________________________________|
v NAME3
________________________________________
| Metadata desc: |
| metadataA |
| metadataF |
| metadataZ |
| metadataL |
|_______________________________________|
v NAME4
________________________________________
| Metadata desc: |
| metadataA |
| metadataF |
| metadataZ |
| metadataL |
|_______________________________________|
我怎样才能让它在 IE8 中工作?
小编辑
为解决这个问题,我尝试不使用ng-include 代替singledata/template.html,而是粗暴地将该部分包含在主HTML 中,现在看起来像这样:
<div ng-repeat="littleObject in bigObject.objects | orderBy:'name':false">
<div>
<button type="button" class="btn btn-default btn-sm" ng-click="showLittleObjectsList = !showLittleObjectsList">
<span class="glyphicon glyphicon-chevron-right" ng-hide="showLittleObjectsList"></span>
<span class="glyphicon glyphicon-chevron-down" ng-show="showLittleObjectsList"></span>
</button>
<span>{{littleObject.name}}</span>
</div>
<div ng-show="showLittleObjectsList">
<div>
<div ng-repeat="(key, metadata) in littleObject.metadata | groupBy:'index'">
<div ng-show="$first">
<strong>
Metadatum desc
</strong>
</div>
<div ng-repeat="metadatum in metadata">
<div>
{{metadatum.desc}}
</div>
</div>
</div>
</div>
</div>
</div>
很遗憾,这并不能解决问题。
编辑
目标的一个重要部分是显示列表及其metadata 按index 分组。我添加了完整的控制器代码,并最终修改了 metadata 索引以使分组更有意义。
【问题讨论】:
-
我不认为你需要支持 IE8,许多 Angular 特性在 IE8 中无法使用,这取决于你让你的生活更艰难:)
-
显然我必须使用 IE8 (:
-
事实上,现在仍然有客户不关心升级他们的 SO,因为原因,所以最终还是要他们意识到你所说的;在那之前,经验法则总是一样的:有钱的客户才是你真正的老板,你必须让你的产品适合他的系统才能得到他的钱。
-
这是一种奇怪的使用 ng-click
ng-click="!showLittleObjectsList"的方式 -
感谢@YOU,实际上我必须对其进行一些修改才能使其正常工作;我对细节的懒惰有时是压倒性的,虽然。
标签: html angularjs loops internet-explorer-8 angularjs-ng-repeat