вызвать событие щелчка из директивы angularjs

Как я могу вызвать событие щелчка для элементов li, указав их индекс из директивы angularjs? Я попытался использовать $first для запуска щелчка для первого элемента, но он не работает.

Спасибо за любую помощь.


person ayimos    schedule 22.04.2013    source источник
comment
Можете ли вы опубликовать код, который вы пробовали.   -  person lucuma    schedule 22.04.2013
comment
Вы говорите, что хотите инициировать событие клика через код? Почему вы хотите это сделать?   -  person tamakisquare    schedule 22.04.2013
comment
Я пытаюсь отобразить изображения в списке. Я хочу отображать первое изображение по умолчанию при загрузке страницы. Пожалуйста, смотрите плункер ниже. На данный момент я делаю это, используя функцию тайм-аута jQuery, которая не является оптимальным решением, но мне нужно изменить ее на angularjs. plnkr.co/edit/CVnp9FKcIMr7GoSpfcoX   -  person ayimos    schedule 22.04.2013


Ответы (4)


Вот, возможно, другой способ добиться этого. Передайте в директиву как индекс, так и элемент, и пусть директива настроит html в шаблоне:

Демонстрация: http://plnkr.co/edit/ybcNosdPA76J1IqXjcGG?p=preview

HTML:

<ul id="thumbnails">
    <li class="thumbnail" ng-repeat="item in items" options='#my-container' itemdata='item' index="$index">

    </li>
  </ul>

JS-директива:

app.directive('thumbnail', [function() {
  return {
    restrict: 'CA',
    replace: false,
    transclude: false,
    scope: {
        index: '=index',
        item: '=itemdata'
    },
    template: '<a href="#"><img src="{{item.src}}" alt="{{item.alt}}" /></a>',
    link: function(scope, elem, attrs) {
        if (parseInt(scope.index) == 0) {
            angular.element(attrs.options).css({'background-image':'url('+ scope.item.src +')'});
        }

        elem.bind('click', function() {
            var src = elem.find('img').attr('src');

            // call your SmoothZoom here
            angular.element(attrs.options).css({'background-image':'url('+ scope.item.src +')'});
        });
    }
}
}]);

Вам, вероятно, было бы лучше добавить ng-click к изображению, как указано в другом ответе.

Обновить

Ссылка на демо неверная. Он был обновлен до: http://plnkr.co/edit/ybcNosdPA76J1IqXjcGG?p=preview

person lucuma    schedule 22.04.2013
comment
ребята, что мы подразумеваем под ограничением = 'CA' в приведенном выше примере? Я видел C и A, но что такое CA? - person Mohammad Umair Khan; 26.08.2013
comment
@lucuma да, я видел это, но я не понимал, как можно использовать комбинацию из 2, идея, которая у меня была, заключалась в том, что мы можем использовать только один из ECMA - person Mohammad Umair Khan; 27.08.2013
comment
Если вы укажете более одного, скажем, EA, ваша директива может быть либо элементом, либо классом. - person lucuma; 27.08.2013
comment
@lucuma Ваш код может привести к неожиданному поведению. Попробуйте выбрать изображения в этом примере: plnkr.co/edit/V5FRHB5Q3LeMSq6If7DM?p=preview Вы должны использовать $apply в jQuery bind (установите useApply = true в приведенном выше примере). Или вы должны использовать ng-click (установить useNg = true). Пожалуйста, обновите свой ответ. - person A-IV; 19.02.2015
comment
Пожалуйста, поправьте меня, если я ошибаюсь, но я не думаю, что вам нужно указывать replace: false и transclude: false. - person Danny Bullis; 24.02.2016

Это больше способ сделать это в Angular: http://plnkr.co/edit/xYNX47EsYvl4aRuGZmvo?p=preview

  1. Я добавил $scope.selectedItem, который поможет вам решить вашу первую проблему (изображение по умолчанию)
  2. Я добавил $scope.setSelectedItem и назвал его в ng-click. Ваши окончательные требования могут отличаться, но использование директивы для привязки click и изменения src было излишним, так как большая часть этого может быть обработана с помощью шаблона.
  3. Обратите внимание на использование ngSrc, чтобы избежать ошибочных вызовов сервера при начальной загрузке.
  4. Вам нужно будет настроить некоторые стили, чтобы изображение располагалось прямо в div. Если вам действительно нужно использовать background-image, вам понадобится такая директива, как ngSrc, которая откладывает установку стиля background-image до тех пор, пока не будут загружены реальные данные.
person Langdon    schedule 22.04.2013

Это расширение ответа Лэнгдона с директивным подходом к проблеме. Если вы собираетесь разместить на странице несколько галерей, это может быть одним из способов сделать это без особых хлопот.

Использование:

<gallery images="items"></gallery>
<gallery images="cats"></gallery>

Посмотрите, как это работает здесь

person Jay    schedule 22.04.2013

Вот как я смог вызвать нажатие кнопки при загрузке страницы.

<li ng-repeat="a in array">
  <a class="button" id="btn" ng-click="function(a)" index="$index" on-load-clicker>
    {{a.name}}
  </a>
</li>

Простая директива, которая берет индекс из ng-repeat и использует условие для вызова первой кнопки в индексе и щелчка по ней при загрузке страницы.

angular
    .module("myApp")
        .directive('onLoadClicker', function ($timeout) {
            return {
                restrict: 'A',
                scope: {
                    index: '=index'
                },
                link: function($scope, iElm) {
                    if ($scope.index == 0) {
                        $timeout(function() {

                            iElm.triggerHandler('click');

                        }, 0);
                    }
                }
            };
        });

Это был единственный способ, которым я смог запустить автоматический щелчок программно. angular.element(document.querySelector('#btn')).click(); Не работает из контроллера, поэтому создание этой простой директивы кажется наиболее эффективным, если вы пытаетесь выполнить щелчок при загрузке страницы, и вы можете указать, какую кнопку щелкнуть, передав index. Мне помог этот ответ о переполнении стека из другой ссылки на сообщение: https://stackoverflow.com/a/26495541/4684183 Директива onLoadClicker.

person Ian Poston Framer    schedule 30.11.2016
comment
Если вы собираетесь проголосовать против, пожалуйста, объясните, почему. Вы не поможете сообществу, выражая негатив без объяснения причин. Я разместил этот ответ выше, потому что другие решения у меня не сработали. - person Ian Poston Framer; 08.09.2017
comment
вероятно, кто-то пытался вас огорчить. происходит со мной постоянно. по крайней мере мой голос возвращает вас к 0 \_shrug_/ - person activedecay; 16.01.2018