Директива, которая показывает образец в зависимости от того, какое значение выделяет пользователь

#angularjs

#angularjs

Вопрос:

Я застрял с Angular. У меня есть директива, которая показывает список, и когда пользователь наводит курсор на элемент, я хочу показать предварительный просмотр элемента, причем предварительный просмотр предоставляется пользователем директивы. Однако есть некоторые хитрости… Я хочу, чтобы пользователь мог фильтровать список с помощью ввода [что само по себе легко], и вокруг списка есть некоторый базовый стиль, который я хотел бы, чтобы директива обрабатывала, например, добавляя флажки, за которыми следует следить, чтобы создать модель для директивы.

Я хочу, чтобы пользователь директивы просто мог писать:

 <preview-list list='unfilteredlist'>
    <div>
        <h1><blink>{{title}}</blink></h1>
        <h2><marquee>{{html extrodinaire}}</marquee></h2>
    </div>
</preview-list>
  

Я пытался использовать ng-transclude, но он использует родственную область видимости, и я искал обходные пути, но не смог их найти. Единственные, которые я нашел, включали написание всего шаблона на javascript, что, честно говоря, я не могу поверить, что люди думают, что это приемлемое решение.

Какие-либо решения, или это на самом деле совершенно невозможно в Angular?

Комментарии:

1. Я пробовал множество других способов и обходных путей … ни один из них не сработал из-за строгого ограничения angular. Мне просто придется отказаться от использования transclusion… Я думаю, пользователь не сможет добавить пользовательский html. 🙁

Ответ №1:

Как я вижу, у вас есть два варианта :

  1. Создайте окно предварительного просмотра для каждого элемента в вашем списке и переключайте видимость при наведении курсора мыши. Это здорово, если у вас всего несколько значений, а окно предварительного просмотра слишком большое.

  2. Создайте переведенную директиву, в которой — основная область будет содержать список и текущий элемент наведения. Дочерняя область будет содержать контейнер предварительного просмотра. Как только выбранное значение изменится, окно предварительного просмотра обновится (в соответствии с вашими привязками), и единственное, что осталось сделать, это расположить его.

сначала сложно выполнить трансклюдирование, но это окупается.

Надеюсь, это поможет.

Комментарии:

1. вариант 1 неосуществим для более чем пары элементов, как вы упомянули, а вариант 2 потребует, чтобы фильтрация также выполнялась в основной области, а не в директиве, даже если это код директив, который выполняет эту фильтрацию; поэтому я не смог бы упаковать фильтрацию, поэтому для каждого проекта, который использовал эту директиву, им пришлось бы воссоздать функцию фильтрации или повторно подключить функцию, которая была включена в директиву, в которую был упакован модуль. Я знаю, что концепция transclude потрясающая, но я ищу реальный способ их реализации.

2. В документации упоминается, что transclude предназначен для произвольных данных, но я ищу аналогичную функциональность с заданными данными. [ie. из ng-repeat или изменяющегося объекта области видимости] Я подумываю о том, чтобы, возможно, создать другую директиву, которую можно использовать для вставки произвольных данных в атрибут, и она заменит его, я не уверен, возможно ли это… Я поиграю завтра.

3. Я не смог найти способ обойти это. Я попытался использовать переменную main scope в качестве итератора для ng-repeat в директиве, но это не сработало. Я попытался использовать ng-init для передачи итератора в основную переменную области видимости, но это все равно не сработало. Обычно я могу найти способ, но у Angular так мало вариантов, что это кажется невозможным. Спасибо за вашу помощь, но, похоже, мне просто придется отказаться от трансклюзии. Я не могу дождаться, чтобы отказаться от Angular для Polymer.