Условная логика в шаблоне AngularJS


у меня есть угловой шаблон, который выглядит так...

<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 чтобы показать привязку данных.

что мне нужно сделать, это сделать "От", "До" и "arrowTo" divs показывают условно, в зависимости от содержания данных.

журнал это...

  • если в данных есть объект "from", то покажите div" from " и свяжите данные, но не показывайте div "createdBy .
  • если нет объекта "from", но есть объект" createdBy", то покажите div" createdBy " и свяжите данные.
  • если в данных есть объект "to", то покажите div" arrowTo " и свяжите его данные.

или на простом английском языке, если есть адрес from, покажите его, иначе покажите, кто создал запись вместо этого, и если есть адрес, то покажите это тоже.

Я изучил использование ng-switch, но я думаю, что мне придется добавить дополнительная разметка, которая оставила бы пустой div, если бы не было данных. Плюс мне нужно будет вложить директивы переключения, и я не уверен, что это сработает.

какие идеи?

обновление:

Если бы я написал свою собственную директиву (если бы я знал, как!) тут вот некоторые псевдо-код, чтобы показать, как я хотел бы использовать его...

<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.

3 66

3 ответа:

угловой 1.1.5 ввел НГ-если

можно использовать ngSwitch:

app.directive('conditionalTemplate', function($http, $compile) {
   return {
      restrict: 'E',
      require: '^ngModel',
      link: function(sope, element, attrs, ctrl) {
        // get template with $http
        // check model via ctrl.$viewValue
        // compile with $compile
        // replace element with element.replaceWith()
      }
   };
});

вы можете использовать ng-show на каждом элементе div в цикле. Это то, что вы хотели:http://jsfiddle.net/pGwRu/2/ ?

<div class="from" ng-show="message.from">From: {{message.from.name}}</div>