当前位置: 首页 > 面试题库 >

AngularJS模板中的条件逻辑

东方灵均
2023-03-14
问题内容

我有一个看起来像这样的有角模板…

<div ng-repeat="message in data.messages" ng-class="message.type">

    <div class="info">
        <div class="type"></div>
        <div class="from">From Avatar</div>
        <div class="createdBy">Created By Avatar</div>
        <div class="arrowTo">
            <div class="arrow"></div>
            <div class="to">To Avatar</div>
        </div>
        <div class="date">
            <div class="day">25</div>
            <div class="month">Dec</div>
        </div>
    </div>

    <div class="main">
        <div class="content">
            <div class="heading2">{{message.title}}</div>
            <div ng-bind-html="message.content"></div>
        </div>

    </div>

    <br />
    <hr />
    <br />

</div>

我已经设置了一个JSfiddle来显示绑定的数据。

我需要做的是根据数据内容有条件地显示“ from”,“ to”和“ arrowTo” div。

日志是这个…

  • 如果数据中存在“ from”对象,则显示“ from” div并绑定数据,但不显示“ createdBy” div。
  • 如果没有“来自”对象,但是有“ createdBy”对象,则显示“ createdBy” div并绑定数据。
  • 如果数据中有一个“ to”对象,则显示“ arrowTo” div并将其绑定。

或用简单的英语显示,如果有一个发自地址,则显示它,否则,显示由谁创建记录,如果有一个至地址,则也显示该地址。

我已经研究过使用ng-switch,但是我想我必须添加额外的标记,如果没有数据,它将留下一个空的div。另外,我需要嵌套switch指令,但不确定是否可行。

有任何想法吗?

更新:

如果我要编写自己的指令(如果我知道怎么做!),那么这里有一些伪代码来说明我将如何使用它……

<div ng-if="showFrom()">
    From Template Goes Here
</div>
<div ng-if="showCreatedBy()">
    CreatedBy Template Goes Here
</div>
<div ng-if="showTo()">
    To Template Goes Here
</div>

如果函数/表达式评估为false,则每一个都将消失。


问题答案:

Angular 1.1.5引入了ng-if指令。这是针对此特定问题的最佳解决方案。如果您使用的是Angular的旧版本,请考虑使用angular-
ui的ui-if指令。

如果您是在这里寻找“模板中的条件逻辑”这一一般问题的答案,请考虑:

  • 1.1.5还引入了三元运算符
  • ng-switch可用于有条件地从DOM中添加/删除元素
  • 另请参阅如何在AngularJS中有条件地应用CSS样式?

原始答案:

这是一个不太好的“ ng-if”指令:

myApp.directive('ngIf', function() {
    return {
        link: function(scope, element, attrs) {
            if(scope.$eval(attrs.ngIf)) {
                // remove '<div ng-if...></div>'
                element.replaceWith(element.children())
            } else {
                element.replaceWith(' ')
            }
        }
    }
});

允许使用以下HTML语法:

<div ng-repeat="message in data.messages" ng-class="message.type">
   <hr>
   <div ng-if="showFrom(message)">
       <div>From: {{message.from.name}}</div>
   </div>    
   <div ng-if="showCreatedBy(message)">
      <div>Created by: {{message.createdBy.name}}</div>
   </div>    
   <div ng-if="showTo(message)">
      <div>To: {{message.to.name}}</div>
   </div>    
</div>

小提琴。

replaceWith()用于从DOM中删除不需要的内容。

另外,正如我在Google+上提到的那样,如果您想使用ng-show而不是自定义指令,则ng-
style
可能可以有条件地加载背景图片。(为了其他读者的利益,Jon在Google+上说:“两种方法都使用ng-
show,我想避免这种方法,因为它使用display:none并在DOM中留下了额外的标记。在这种情况下,这是一个特殊的问题,因为隐藏的元素将具有背景图片,该图片仍将在大多数浏览器中加载。”)。
另请参阅如何在AngularJS中有条件地应用CSS样式?

的角度的UI的UI-如果指令手表更改如果条件/表达。我的不是。因此,虽然我的简单实现可以在模型发生更改时正确地更新视图,从而仅影响模板输出,但是如果条件/表达式答案发生更改,它将无法正确地更新视图。

例如,如果模型中from.name的值更改,则视图将更新。但是,如果delete $scope.data.messages[0].from使用from,则将从视图中删除from名称,但不会从视图中删除模板,因为不会监视if-condition / expression。



 类似资料:
  • 问题内容: 在下面的cellTemplate中显示数据时如何添加条件: 预期结果应为行状态显示。 这是the 子 提前致谢。 问题答案: 您必须使用。 在您的标记中,定义网格持有人,如下所示。 并在您的控制器中使用以下代码: 或使用角度滤镜。 请注意,这仅 呈现 文本。最好的方法是在ui-grid中使用它之前先转换为具有真实文本状态。以防万一您以后要进行一些基于文本的过滤。 这是一个柱塞

  • 是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试。 一个应用的代码架构有很多种。对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点。考虑到这一点,我们用AngularJS来为我们的应用添加一些模型、视图和控制器。 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部

  • 问题内容: 我可以在AngularJS 1.5组件中使用多个模板吗?我有一个具有一个属性的组件,因此我想基于该属性名称加载不同的模板。如何根据元素的属性名称加载模板? 谢谢。 问题答案: 我使用两种方法在1.5.x中制作组件的动态模板: 1)通过attr属性传递: 2)将服务注入模板并从那里获取模板: templateURL函数: 在getTemplate函数中,返回基于变量的模板URL 首先通过

  • 英文原文:http://emberjs.com/guides/templates/conditionals/ 有些时候,或许我们只希望在一个属性存在的时候显示一部分模板。 这时,我们就可以使用{{#if}}助手按条件渲染一个代码块,如下所示: 1 2 3 {{#if person}} Welcome back, <b>{{person.firstName}} {{person.lastNam

  • 问题内容: 如何在angularJS中有条件地执行ng-include? 例如,如果变量设置为,我只想包含一些内容。 问题答案: 如果您使用的是Angular v1.1.5或更高版本,则还可以使用ng- if : 如果您有任何旧版本: 使用ng-switch: 小提琴

  • 在本章中,我们将讨论Axure RP中使用的条件逻辑。 如果 - 然后 - 在Axure中 与任何其他编程工具一样,Axure也支持条件逻辑,以在原型中创建增强的交互。 一旦熟悉了如何提供交互,为交互提供条件逻辑就是下一个层次。 以下是条件逻辑的简单流程 - 如果,单击特定小部件/屏幕 然后,执行特定的操作/交互 否则,保持/更改小部件或屏幕的状态 为了更好地理解这一点,让我们从前面的例子中恢复流