2016-04-07 19 views
9

Tôi gặp sự cố khi sử dụng bootstrap-daterangepicker trong chỉ thị Góc. Nó hoạt động tốt khi ban đầu tải trang, nhưng khi chuyển đổi các trang/tiểu bang (tôi đang sử dụng ui-router) và trở lại một trang với một daterangepicker plugin không hoạt động nữa.Sử dụng bootstrap-daterangepicker trong chỉ thị Góc

Nó ném lỗi này:

TypeError: $(...).daterangepicker is not a function

Nó có vẻ như các plugin đã loại bỏ bản thân khi thay đổi trạng thái. Bất cứ ai một ý tưởng làm thế nào để sửa lỗi này?

app.directive("daterangepicker", function() { 
    return { 
     restrict: "A", 
     scope: false, 
     link: function($scope, $element, $attr){ 

     $($element).daterangepicker({ 
      format: "DD.MM.YYYY", 
      startDate: moment().subtract('days', 1), 
      endDate: new Date(),   
      buttonClasses: ['btn-primary'], 
     }, function(from, to) { 
      $scope.date = {from: from, to: to}; 
      $scope.$apply(); // I need apply() here to use the two-way-databinding 
     }); 
     } 
    } 
    }); 
+0

Không không không ... Sử dụng https://github.com/fragaria/angular-daterangepicker không phải phiên bản jQuery –

+0

Vâng, tôi cũng đã thử điều đó, nó dựa trên phiên bản jQuery dưới dạng phụ thuộc và có cùng vấn đề như tôi có. –

+0

Không có thắc mắc tại sao bạn nhận được lỗi này, nếu đây là cách bạn đang sử dụng phiên bản angularjs –

Trả lời

4

cuối cùng tôi đã tìm thấy giải pháp cho vấn đề của tôi!

Để rõ ràng: lỗi tương tự đã xảy ra với plugin góc cạnh daterangepicker.

Thực tế là do một số phụ thuộc khác đã tải thêm jQuery. Bởi vì nhiều jQuery này đã được tải và điều này gây ra lỗi.

3

Thử thêm số này trước khi khởi tạo daterangepicker trong directive.

if (!jQuery().daterangepicker) { 
    return; 
} 

$($element).daterangepicker({...}); 
+0

Điều này ngăn không cho lỗi kích hoạt nhưng nó không khởi tạo bộ chọn nữa ... –

+0

Bạn có thể xác minh thứ tự các tệp JS được xác định trong html chính của bạn không? –

5

tôi sẽ tránh reinventing the wheel, đã có một chỉ thị được cung cấp bởi một số dự án, sử dụng nhập https://angular-ui.github.io/bootstrap/

module:

angular.module('myModule', ['ui.bootstrap']);

và việc sử dụng nó như thế:

<!doctype html> 
<html ng-app="ui.bootstrap.demo"> 

<head> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.js"></script> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-animate.js"></script> 
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-1.3.2.js"></script> 
    <script src="example.js"></script> 
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"> 
</head> 

<body> 

    <style> 
    .full button span { 
     background-color: limegreen; 
     border-radius: 32px; 
     color: black; 
    } 

    .partially button span { 
     background-color: orange; 
     border-radius: 32px; 
     color: black; 
    } 
    </style> 
    <div ng-controller="DatepickerPopupDemoCtrl"> 
    <pre>Selected date is: <em>{{dt | date:'fullDate' }}</em></pre> 

    <h4>Popup</h4> 
    <div class="row"> 
     <div class="col-md-6"> 
     <p class="input-group"> 
      <input type="text" class="form-control" uib-datepicker-popup="{{format}}" ng-model="dt" is-open="popup1.opened" datepicker-options="dateOptions" ng-required="true" close-text="Close" alt-input-formats="altInputFormats" /> 
      <span class="input-group-btn"> 

      <button type="button" class="btn btn-default" ng-click="open1()"><i class="glyphicon glyphicon-calendar"></i></button> 

      </span> 
     </p> 
     </div> 

     <div class="col-md-6"> 
     <p class="input-group"> 
      <input type="text" class="form-control" uib-datepicker-popup ng-model="dt" is-open="popup2.opened" datepicker-options="dateOptions" ng-required="true" close-text="Close" /> 
      <span class="input-group-btn"> 

      <button type="button" class="btn btn-default" ng-click="open2()"><i class="glyphicon glyphicon-calendar"></i></button> 

      </span> 
     </p> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="col-md-6"> 
     <label>Format: <span class="muted-text">(manual alternate <em>{{altInputFormats[0]}}</em>)</span></label> 
     <select class="form-control" ng-model="format" ng-options="f for f in formats"> 
      <option></option> 
     </select> 
     </div> 
    </div> 

    <hr /> 
    <button type="button" class="btn btn-sm btn-info" ng-click="today()">Today</button> 
    <button type="button" class="btn btn-sm btn-default" ng-click="setDate(2009, 7, 24)">2009-08-24</button> 
    <button type="button" class="btn btn-sm btn-danger" ng-click="clear()">Clear</button> 
    <button type="button" class="btn btn-sm btn-default" ng-click="toggleMin()" uib-tooltip="After today restriction">Min date</button> 
    </div> 
</body> 

</html> 

Bộ điều khiển:

angular.module('ui.bootstrap.demo', ['ngAnimate', 'ui.bootstrap']); 
angular.module('ui.bootstrap.demo').controller('DatepickerPopupDemoCtrl', function($scope) { 
     $scope.today = function() { 
     $scope.dt = new Date(); 
     }; 
     $scope.today(); 

     $scope.clear = function() { 
     $scope.dt = null; 
     }; 

     $scope.inlineOptions = { 
     customClass: getDayClass, 
     minDate: new Date(), 
     showWeeks: true 
     }; 

     $scope.dateOptions = { 
     dateDisabled: disabled, 
     formatYear: 'yy', 
     maxDate: new Date(2020, 5, 22), 
     minDate: new Date(), 
     startingDay: 1 
     }; 

     // Disable weekend selection 
     function disabled(data) { 
     var date = data.date, 
      mode = data.mode; 
     return mode === 'day' && (date.getDay() === 0 || date.getDay() === 6); 
     } 

     $scope.toggleMin = function() { 
     $scope.inlineOptions.minDate = $scope.inlineOptions.minDate ? null : new Date(); 
     $scope.dateOptions.minDate = $scope.inlineOptions.minDate; 
     }; 

     $scope.toggleMin(); 

     $scope.open1 = function() { 
     $scope.popup1.opened = true; 
     }; 

     $scope.open2 = function() { 
     $scope.popup2.opened = true; 
     }; 

     $scope.setDate = function(year, month, day) { 
     $scope.dt = new Date(year, month, day); 
     }; 

     $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate']; 
     $scope.format = $scope.formats[0]; 
     $scope.altInputFormats = ['M!/d!/yyyy']; 

     $scope.popup1 = { 
     opened: false 
     }; 

     $scope.popup2 = { 
     opened: false 
     }; 

     var tomorrow = new Date(); 
     tomorrow.setDate(tomorrow.getDate() + 1); 
     var afterTomorrow = new Date(); 
     afterTomorrow.setDate(tomorrow.getDate() + 1); 
     $scope.events = [{ 
     date: tomorrow, 
     status: 'full' 
     }, { 
     date: afterTomorrow, 
     status: 'partially' 
     }]; 

     function getDayClass(data) { 
     var date = data.date, 
      mode = data.mode; 
     if (mode === 'day') { 
      var dayToCheck = new Date(date).setHours(0, 0, 0, 0); 

      for (var i = 0; i < $scope.events.length; i++) { 
      var currentDay = new Date($scope.events[i].date).setHours(0, 0, 0, 0); 

      if (dayToCheck === currentDay) { 
       return $scope.events[i].status; 
      } 
      } 
     } 

     return ''; 
     } 
    }); 

plunker: http://plnkr.co/edit/LZgUAZQkNKgDrUZAVWSa?p=preview

Các vấn đề liên quan