web-dev-qa-db-ja.com

AngularJSでjQueryを使用する方法

シンプルな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をどのように使用できるかを本当に理解しておらず、例はありません。

更新:画面にスライダーを配置することはできましたが、機能しません。値を変更したり、それを使用したりすることはできません。

enter image description here

55
Avraam Mavridis

理想的にはそれをディレクティブに入れますが、コントローラーに入れることもできます。 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

ファクトリを使用してディレクティブを作成することもできます。これにより、周辺のサービスや必要な依存関係を統合するための究極の柔軟性が得られます。

44
cameronroe

これは動作するはずです。 this fiddle をご覧ください。

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

ライブラリは、jQuery、jQuery UI CSS、jQuery UI、AngularJSの順にロードしてください。

7
Alethes

ディレクティブでバインディングを行う必要があります。これを見てください:

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>
2
Barth Zalewski

最適なオプションは、ディレクティブを作成し、そこにスライダー機能をラップすることです。秘密はuse $ 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();                    
                });
            }
        };
    }]
);
1
Jorge Alberto