Как использовать jQuery в AngularJS

Я пытаюсь использовать простой jQuery UI. Я включил все, и у меня есть этот простой script:

<script>
  $(function() {
    $( "#slider" ).slider();
  });
</script>

и

<div id="slider"></div>

My включает в себя:

<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.10.4.custom.min.js"></script>
<script type="text/javascript" src="js/jquery.easing.1.3.js"></script>
<script type="text/javascript" src="js/ayaSlider.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript" src="js/angular-route.min.js"></script>
<script type="text/javascript" src="js/app.js"></script>

Но когда я открываю страницу, нет слайдера. Согласно документации angular:

Если jQuery доступен, angular.элемент является псевдонимом для jQuery функция. Если jQuery недоступен, делегаты angular.element Angular встроенное подмножество jQuery.

Однако я не понимаю, как использовать angular.element, и нет примера.

Обновление: Мне удалось создать слайдер на экране, но он не работает, я не могу изменять значения или что-то делать с ним.

enter image description here

Ответ 1

В идеале вы бы поставили это в директиве, но вы также можете просто поместить его в контроллер. http://jsfiddle.net/tnq86/15/

  angular.module('App', [])
    .controller('AppCtrl', function ($scope) {

      $scope.model = 0;

      $scope.initSlider = function () {
          $(function () {
            // wait till load event fires so all resources are available
              $scope.$slider = $('#slider').slider({
                  slide: $scope.onSlide
              });
          });

          $scope.onSlide = function (e, ui) {
             $scope.model = ui.value;
             $scope.$digest();
          };
      };

      $scope.initSlider();
  });

Директивный подход:

HTML

<div slider></div>

JS

  angular.module('App', [])
    .directive('slider', function (DataModel) {
      return {
         restrict: 'A',
         scope: true,
         controller: function ($scope, $element, $attrs) {
            $scope.onSlide = function (e, ui) {
              $scope.model = ui.value;
              // or set it on the model
              // DataModel.model = ui.value;
              // add to angular digest cycle
              $scope.$digest();
            };
         },
         link: function (scope, el, attrs) {

            var options = {
              slide: scope.onSlide  
            };

            // set up slider on load
            angular.element(document).ready(function () {
              scope.$slider = $(el).slider(options);
            });
         }
      }
  });

Я также рекомендовал бы проверить исходный код Angular Bootstrap: https://github.com/angular-ui/bootstrap/blob/master/src/tooltip/tooltip.js

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

Ответ 2

Это должно работать. Пожалуйста, посмотрите эту скрипту.

$(function() {
   $( "#slider" ).slider();
});//Links to jsfiddle must be accompanied by code

Убедитесь, что вы загружаете библиотеки в следующем порядке: jQuery, jQuery UI CSS, jQuery UI, AngularJS.

Ответ 3

Вы должны сделать привязку в директиве. Посмотрите на это:

angular.module('ng', []).
directive('sliderRange', function($parse, $timeout){
    return {
        restrict: 'A',
        replace: true,
        transclude: false,
        compile: function(element, attrs) {            
            var html = '<div class="slider-range"></div>';
            var slider = $(html);
            element.replaceWith(slider);
            var getterLeft = $parse(attrs.ngModelLeft), setterLeft = getterLeft.assign;
            var getterRight = $parse(attrs.ngModelRight), setterRight = getterRight.assign;

            return function (scope, slider, attrs, controller) {
                var vsLeft = getterLeft(scope), vsRight = getterRight(scope), f = vsLeft || 0, t = vsRight || 10;                        

                var processChange = function() {
                    var vs = slider.slider("values"), f = vs[0], t = vs[1];                                        
                    setterLeft(scope, f);
                    setterRight(scope, t);                    
                }                 
                slider.slider({
                    range: true,
                    min: 0,
                    max: 10,
                    step: 1,
                    change: function() { setTimeout(function () { scope.$apply(processChange); }, 1) }
                }).slider("values", [f, t]);                    
            };            
        }
    };
});

Это показывает пример диапазона ползунков, выполненного с помощью jQuery UI. Пример использования:

<div slider-range ng-model-left="question.properties.range_from" ng-model-right="question.properties.range_to"></div>

Ответ 4

Лучший вариант - создать директиву и обернуть туда функции слайдера. Секрет заключается в использовании $timeout, код jquery будет вызываться только тогда, когда DOM готов.

angular.module('app')
.directive('my-slider', 
    ['$timeout', function($timeout) {
        return {
            restrict:'E',
            scope: true,
            template: '<div id="{{ id }}"></div>',
            link: function($scope) {
                $scope.id = String(Math.random()).substr(2, 8);

                $timeout(function() {
                    angular.element('#'+$scope.id).slider();                    
                });
            }
        };
    }]
);