Angular ng-repeat 根据发回的 JSON 在 html 上呈现视图

Angular ng-repeat renders view on html based on JSON sent back

所以我正在尝试渲染我称之为图块的东西。现在所有这些图块看起来都一样,但显示的数据点将根据特定的 属性 称为 "name" 而不同。所以 JSON 看起来像这样:

{
  "beginDate": "2015-01-01T00:00:00",
  "endDate": "2015-12-31T00:00:00",
  "balance": 6989.68,
  "annualAmt": 7200,
  "claimAmt": 210.32,
  "payableAmt": 0,
  "reimbAmt": 210.32,
  "amtToClaim": 0,
  "id": "%2bhnc3gHgwibPEOiPrFKV2g%3d%3d",
  "benefit": "HRAPrime",
  "name": "Preferred Dental Plan (Kennedy)",
  "planTypeId": 4,
  "benefitTypeId": 22,
  "benefitCode": "HRADEN"
},
{
  "balance": 0,
  "ordersPlaced": 0,
  "fundsUsed": 0,
  "lastOrder": 0,
  "currentOrder": 0,
  "currentOrderMonth": "October",
  "lastUpdateDay": "2015-09-20T00:00:00",
  "id": "P06CqlD5cwnLFaxEKvbikA%3d%3d",
  "benefit": "FlexiPass",
  "name": "Flexi-Pass Transit/Vanpool Benefit",
  "planTypeId": 6,
  "benefitTypeId": 29,
  "benefitCode": "FCTRANS"
}

所以您可以看到数据点有何不同,其中一个数据具有某些属性而另一个数据没有(非常轻微)。所以渲染视图看起来像这样:

您会看到一个显示的位置 'last date to incur',另一个不显示的位置,依此类推。好吧,登录用户可能有几个或两个磁贴。因此,当呈现这些节目的页面时,它需要循环执行此操作,我相信 angular 有一个简单的方法可以完成,但我没有成功,所以希望能在这里得到一些帮助。

所以基本上,在检索到的所有 JSON 中,有些会显示,大多数不会,然后根据 属性 "name",不同的会显示或类似的东西.

有什么想法和帮助吗?

如果不清楚,请告诉我。我相信我看到的是模板之类的。

非常感谢。

您正在寻找这样的东西吗? https://jsfiddle.net/leojavier/eb20ar4L/

<div ng-app="App" ng-controller="Controller">
    <div>
        <ul ng-repeat="item in data">
            <li class="title">{{item.name}}</li>
            <li>
                <p>Plan:{{item.benefit}}</p>
                <p class="id">Customer ID:<br/><span>{{item.id}}<span></p>
            </li>
            <li ng-show="item.balance>0">
                <strong>Current balance: </strong>
                <p class="numbers">{{item.balance | currency:"USD$"}}</p>
            </li>
            <li ng-show="item.annualAmt>0">
                <strong>Current balance: </strong>
                <p class="numbers">{{item.annualAmt | currency:"USD$"}}</p>
            </li>
            <li class="date" ng-show="item.lastUpdateDay">
                <p><strong>Date: </strong>{{item.lastUpdateDay}}</p>
            </li>
        </ul>
    </div>
</div>

CSS

body{
    background:#F2F2F2;;
}
.title{
    background:#333;
    color:#FFF;
    padding:10px;
    text-transform:uppercase;
    font-size:0.8em;
    margin:-20px -20px 20px -20px;
}
ul {
    position:relative;
    height:350px;
    display:block;
    float:left;
    list-style-type: none;
    padding:20px;
    display:inline-block;
    border:thin solid #CCC;
    background:#FFF;
    margin:5px;
    font-family:arial;
}
li{;
    line-height:30px;

}
.numbers{
    margin:0;
    color:#F00;
    font-size:1.5em;
}
.id span{
    background:#E2E2E2;
    color:#555;
    padding:10px;
    font-size:0.8em;
}

.date{
    position: absolute;
    bottom:0;
}

JS var App = angular.module('App', []);

App.controller('Controller', function($scope){

    $scope.data = [
{
  "beginDate": "2015-01-01T00:00:00",
  "endDate": "2015-12-31T00:00:00",
  "balance": 6989.68,
  "annualAmt": 7200,
  "claimAmt": 210.32,
  "payableAmt": 0,
  "reimbAmt": 210.32,
  "amtToClaim": 0,
  "id": "%2bhnc3gHgwibPEOiPrFKV2g%3d%3d",
  "benefit": "HRAPrime",
  "name": "Preferred Dental Plan (Kennedy)",
  "planTypeId": 4,
  "benefitTypeId": 22,
  "benefitCode": "HRADEN"
},
{
  "balance": 0,
  "ordersPlaced": 0,
  "fundsUsed": 0,
  "lastOrder": 0,
  "currentOrder": 0,
  "currentOrderMonth": "October",
  "lastUpdateDay": "2015-09-20T00:00:00",
  "id": "P06CqlD5cwnLFaxEKvbikA%3d%3d",
  "benefit": "FlexiPass",
  "name": "Flexi-Pass Transit/Vanpool Benefit",
  "planTypeId": 6,
  "benefitTypeId": 29,
  "benefitCode": "FCTRANS"
}];

});

我希望这对男人有帮助... https://jsfiddle.net/leojavier/eb20ar4L/

在分叉由@LeoJavier 提供的 fiddle 并研究模板的想法后,我想出了一个可行的示例,它可以作为您所追求的基础。

关键概念是两个指令和用于管理模板的工厂。在这个 简单 示例中,模板以内联方式存储,但在生产应用程序中,每个模板可能都位于自己的文件中。

第一个指令 <card> 有一个非常基本的目的,即通过 ngModel.

将每个元素的隔离范围映射到模板
App.directive('card', function () {
    return {
        restrict: 'E',
        scope: {
            item: '=ngModel'
        }
    };
});

下一系列指令的任务是从模板工厂中检索匹配的模板。请注意,在工厂中,我们将模板 url 作为字符串提供到原始 HTML 中,因此需要转义引号。:

App.directive('template1', function (templates) {
    return {
        replace: true,
        template: templates.template1
    };
});

App.directive('template2', function (templates) {
    return {
        replace: true,
        template: templates.template2
    };
});

App.factory('templates', function () {
    return {
        template1: '<ng-include src="\'template1.html\'"></ng-include>',
        template2: '<ng-include src="\'template2.html\'"></ng-include>'
    };
});

同样,在我们的例子中,模板内嵌在 HTML 中。重要的是,模板的 <script> 标签位于 ng-app 所在的元素,如下所示:

<div ng-app="App" ng-controller="Controller">
....
 <!-- template1.html -->
<script type="text/ng-template" id="template1.html">
....
</script>

<!-- template2.html -->
<script type="text/ng-template" id="template2.html">
....
</script>
</div>

至于用法,一个简单的循环遍历数组中的每个对象,使用 ng-if 来呈现我们每次迭代所需的特定模板。

<ul ng-repeat="item in data">
    <div ng-if="item.planTypeId==4">
        <card template1 ng-model="item"></card>
    </div>
    <div ng-if="item.planTypeId==6">
        <card template2 ng-model="item"></card>
    </div>
</ul>

https://jsfiddle.net/d0x460ge/

请注意,这只是实现此目的的众多方法之一,此代码只是概念证明,因此可以进行一些重构。话虽这么说,但我希望这能让您了解可以采取的可能方向。