【问题标题】:Use a condition in ng-repeat在 ng-repeat 中使用条件
【发布时间】:2013-10-06 13:36:40
【问题描述】:

我有一个简单的 ng-repeat

<div ng-repeat="obj in someArray"></div>

如果obj.type == "type1",我想使用自定义指令“type1”,如果obj.type == "type2",我想使用自定义指令“type2”。有没有聪明的方法来做到这一点?

编辑

我将在不同的位置使用此解决方案,因此我想将逻辑放在指令中而不是 html 中。我在想也许我可以使用“包含”一个指令或另一个指令的“父”指令,具体取决于obj.type。你怎么看?

【问题讨论】:

标签: angularjs angularjs-directive


【解决方案1】:

在当前稳定版本 (1.0.8) 中,我们无法将函数归因于 templateUrl,所以这就是我所做的。

HTML

<div ng-controller="MainCtrl">
    <div class="genericDirective" ng-repeat="obj in someArray"></div>
</div>

Javascript

var app = angular.module("myApp", []);

app.controller("MainCtrl", function ($scope) {
    $scope.someArray = [
        {type:"type1",title:"lorem"},
        {type:"type2",title:"ipsum"},
        {type:"type2",title:"dolor"}
    ];
});

app.directive("genericDirective", function(){
    return{
        restrict: "C",
        templateUrl: "genericDirective.html" 
    };
});

genericDirective.html

<div ng-include="thumb.type+'Thumb.html'"></div>

由于某种原因,我没有设法嵌套指令,所以我改用了ng-include。 (编辑:问题已解决here

【讨论】:

    【解决方案2】:

    根据您的需要,您可以使用 ngClass。

    <div ng-repeat="obj in someArray">
      <div ng-class"{class1: obj.type == "type1", class2: obj.type == "type2"}"></div>
    </div>
    

    在此示例中,对象的类型将应用一个类。 请参阅http://docs.angularjs.org/api/ng.directive:ngClass 了解更多信息。

    如果这是解析数据或类似的东西,你可以尝试使用一个指令,并处理里面的情况。

    编辑:

    要扩展后者,您可以将逻辑放在服务中并在父指令中调用适当的函数。 http://docs.angularjs.org/guide/dev_guide.services.creating_services

    【讨论】:

    • 我已经用更多标记编辑了我的答案。如果你想走这条路,我还扩展了如何执行父指令。
    • 如果您有兴趣,我已经回答了我的问题
    【解决方案3】:
    <div ng-repeat="obj in someArray">
        <type1 ng-if="obj.type=='type1'"></type1>
        <type2 ng-if="obj.type=='type2'"></type2>
    </div>
    

    在 Angular 1.2 中,您也可以使用更高效的 ng-switch 指令。

    我想我应该补充一点,测试可能看起来更像这样

    ng-if="obj instanceof type1"
    

    取决于你所说的类型。

    根据进一步的 cmets,我相信这也是您问题的一个可能答案:

    Angular Directive Different Template

    不过,ng-if 或 ng-switch 是一种更简单的方法,因为它不需要任何关于 ng-repeat 对象类型的特殊知识。

    【讨论】:

    • 我正在寻找一种不需要太多逻辑 html 端的解决方案。对不起,我应该更精确
    • 你想在哪里指定包含的逻辑?
    • 指令本身可能是最好的地方。根据 obj.type 在指令内指定不同的模板可能是一个好方法。
    • 这就是我的想法,但是是否可以有两个“模板”或“模板Url”
    • 是的,如果您在链接函数中测试类型,您可以指定任何您想要的模板。可能会展示你认为 HTML 标记应该是什么样子的假装片段。
    【解决方案4】:

    使用ng-switch:

       <div ng-repeat="obj in someArray">
         <span ng-switch="obj.type">
          <div directive-one ng-switch-when="type1"></div>
          <div directive-two ng-switch-when="type2"></div>
         </span>
        </div>
    

    【讨论】:

    • 我想你可以这样做,但我正在寻找一种不会添加太多 div/span 的解决方案
    • 如果您有兴趣,我已经回答了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多