Angularjs: несколько значений в ng-переключателе, когда

У меня есть следующий ngSwitch:

<p ng-switch="status">
    <span ng-switch-when="wrong|incorrect">
       Wrong
    </span>
    <span ng-switch-default>
       Correct
    </span>
</p>

Как вы можете видеть, у меня есть текст Wrong для двух опций Wrong и correct. Я попытался (как вы можете видеть) использовать трубку |, но это не работает. Любые предложения?

Ответ 2

Это почти то же самое с использованием ng-if, но преимущество этого в том, что вы можете использовать ng-switch-when = "true" или по умолчанию или false несколько раз в главном ng-переключателе.

<p ng-switch on="(status == 'wrong') || (status == 'incorrect')">
    <span ng-switch-when="true">
        Wrong
    </span>
    <span ng-switch-default>
       Correct
    </span>
</p>

Live: http://jsfiddle.net/8yf15t2d/

Ответ 3

Вы не можете иметь несколько условий с одним ng-switch-when.

Один из вариантов заключается в использовании ng-if, но в случае обработки ошибок я предпочитаю заполнять переменную ошибки в области в контроллере и использовать ng-show=error.

Ответ 4

Вы можете добавить фильтр к status, который отображает значения, которые означают одно и то же, в одно и то же значение.

.filter('meaning', function() {
    return function(input) {
      input = input || '';
      if (['wrong', 'amiss','awry', 'bad', 'erroneous', 'false', 'inaccurate',\
           'misguided', 'mistaken', 'unsound', 'incorrect'].indexOf(input) != -1)
          return 'wrong';
      // You can make it generic like this:
      synonymsDictionary = {
        'someWord' : ['syn1', 'syn2', 'syn3' ... ],
        'someOtherWord' : ['otherWordSyn1', 'otherWordSyn2', 'otherWordSyn3' ...]
        .
        .
        .
      };

      for (var word in synonymsDictionary)
          if (synonymsDictionary[word].indexOf(input) != -1)
              return word; // This way you could iterate over a bunch of arrays...

         // Edge case
         else return input;
    };
  })

Затем вы просто

<p ng-switch="status|meaning">
    <span ng-switch-when="wrong">
       Wrong
    </span>
    <span ng-switch-default>
       Correct
    </span>
</p>

Хотя в вашем случае вы, возможно, просто хотели напечатать сообщение, чтобы вы могли вытащить сообщение из словаря...

Что-то вроде:

<span ng-if="status">
    {{getStatusMessage(status)}}
</span>

Ответ 5

Этого нельзя достичь с помощью базовых директив angular, но если хотите, вы можете написать свою собственную директиву для реализации этого и уже могли бы взаимодействовать с существующей директивой ngSwitch.

ngSwitchController имеет одно свойство cases, которое является картой. Каждый ключевой ключ имеет префикс !, а случай по умолчанию равен ?. Каждое значение case - это объект с двумя свойствами: transclude и element.
Предупреждение. В отличие от ngModelController, ngSwitchController - это не опубликованный API, поэтому он может быть изменен.

Основываясь на исходном ngSwitchWhenDirective, мы можем построить multiswitchWhen, который будет работать со всеми существующими директивами ngSwitch, ngSwitchWhen и ngSwitchDefault без конфликтов.

.directive('multiswitchWhen', function () {
    return {
        transclude: 'element',
        priority: 800,
        require: '^ngSwitch',
        link: function(scope, element, attrs, ctrl, $transclude) {
            var selectTransclude = { transclude: $transclude, element: element };
            angular.forEach(attrs.multiswitchWhen.split('|'), function(switchWhen) {
                ctrl.cases['!' + switchWhen] = (ctrl.cases['!' + switchWhen] || []);
                ctrl.cases['!' + switchWhen].push(selectTransclude);
            });
        }
    }
});

Пример plunker: http://plnkr.co/edit/K9znnnFiVnKAgGccSlrQ?p=preview

Ответ 6

Вы можете добавить еще один корпус коммутатора.

Пример:

<p ng-switch="status">
    <span ng-switch-when="wrong">
       Wrong
    </span>
<span ng-switch-when="incorrect">
       Wrong
    </span>
    <span ng-switch-default>
       Correct
    </span>
</p>

Пример в реальном времени: http://jsfiddle.net/choroshin/Zt2qE/2/