2013-09-05 2 views
0

Я хотел бы реализовать директиву, которая позволяет мне определить список животных на элементе. Если пользователю нравятся все эти животные, я хочу показать элемент; в противном случае я хочу скрыть это. В идеале я хотел бы, чтобы она выглядела так:Как я могу разобрать директиву атрибута, который имеет несколько значений?

<div animals="cat dog horse"></div> 

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

Моя предложенная логика для директивы:

app.directive('animals ', function(userService) { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attrs) { 
      // how to parse the attribute and get an array of animal strings? 
      var animalsArray = ... ? 

      if (userService.likesAllAnimals(animalsArray)) 
      { 
       // show element 
      } 
      else 
      { 
       // hide element 
      } 
     } 
    }; 
}); 

Но я потерял о том, как:

  1. Разбираем атрибут animals и вывести animalsArray из него.
  2. Показать и скрыть элемент.

Помощь?

+1

Вы можете использовать String.split ("") для анализа атрибута 'animals'. http://stackoverflow.com/questions/10346722/how-can-i-split-a-javascript-string-by-white-space-or-comma Вы искали, как скрывать и показывать/автоматически делать видимыми в AngularJS ? –

+0

Спасибо за ссылку. Я думал об использовании 'split', мне просто интересно, существует ли встроенный метод Angular для анализа атрибута, который имеет значения, разделенные пробелами. –

+0

Могут ли элементы, добавляемые в директиву, не добавляться в контроллер. Зачем использовать директиву? Тогда это просто вопрос шоу и скрыть. – Chandermani

ответ

1

Вы можете попробовать это:

app.directive('animals', function(userService) { 
    return { 
    restrict: 'A', 
    link: function (scope, element, attrs) { 
     var animals = attrs.animals.split(' '); 

     if (userService.likesAllAnimals(animals)) 
     element.css('display', 'block'); 
     else 
     element.css('display', 'none'); 
    } 
    }; 
}); 

Plunker here.

Вы можете сделать это, а также:

app.directive('animals', function(userService, $parse) { 
    return { 
    restrict: 'A', 
    link: function (scope, element, attrs) { 
     var animals = $parse(attrs.animals)(scope); 

     if (userService.likesAllAnimals(animals)) 
     element.css('display', 'block'); 
     else 
     element.css('display', 'none'); 
    } 
    }; 
}); 

И теперь вы можете передать фактический массив директивы:

<div animals="['cat','dog','horse']"> 

или

<div ng-init="list=['cat','dog','horse']" animals="list"> 

Другой Plunker here.

Смежные вопросы