如何在 AngularJS 中使用 jQuery

IT技术 javascript jquery angularjs
2021-01-28 08:32:30

我正在尝试使用简单的 jQuery UI。我已经包含了所有内容,并且有这个简单的脚本:

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

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

我的包括:

<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>

但是当我打开页面时没有滑块。根据角度文档:

如果 jQuery 可用,则 angular.element 是 jQuery 函数的别名。如果 jQuery 不可用,angular.element 将委托给 Angular 的内置 jQuery 子集。

但是,我真的不明白如何使用angular.element并且没有示例。

更新:我设法让滑块出现在屏幕上,但它不起作用,我无法更改值或用它做一些事情。

在此处输入图片说明

4个回答

理想情况下,您会将其放入指令中,但您也可以将其放入控制器中。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

您还可以使用工厂来创建指令。这为您提供了极大的灵活性,可以围绕它集成服务以及您需要的任何依赖项。

使用 jQuery 并不一定意味着事情会变得混乱,这通常是由于代码结构不佳。理想情况下,您希望使用您需要的任何内容在服务中构建一个 api,然后在您的指令中调用这些方法。
2021-03-20 08:32:30
angular.element(document).ready(function () { scope.$slider = $(el).slider(options); }); 帮我解决了这个问题。谢谢
2021-03-24 08:32:30
这将如何在 angular4 中?
2021-04-08 08:32:30

这应该有效。请看看这个小提琴

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

确保按以下顺序加载库:jQuery、jQuery UI CSS、jQuery UI、AngularJS。

我的意思是“您发布的代码应该可以工作”,前提是您以正确的顺序加载库。
2021-03-21 08:32:30
这既简单又好……为什么不使用这种技术而不是复杂的公认技术呢?
2021-03-27 08:32:30
您没有按该顺序加载库。我想你需要/想要在 jQuery 之前加载 angular 和依赖项
2021-03-29 08:32:30
@user23236245242 据我所知,小提琴显示的正是你想要的。另外在这里添加AngularJS了外部资源,它工作正常。看看这里的源代码
2021-04-12 08:32:30

您必须在指令中进行绑定。看这个:

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>

最好的选择是创建一个指令并将滑块功能包装在那里。秘诀是使用 $timeout,只有当 DOM 准备好时才会调用 jquery 代码。

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();                    
                });
            }
        };
    }]
);