Добавить Bootstrap DateRangePicker в Angular Ui-Grid headerCellTemplate

Я пытаюсь добавить загрузочный DateRangePicker в свой шаблон заголовка для Angular UI-Grid. Я вижу, что шаблон работает правильно, потому что он показывает значок Bootstrap. Я не хочу использовать собственный угловой тип: «дата». Я хочу использовать средство выбора даты начальной загрузки.

У меня есть все необходимые для этого включения.

<!-- Include Required Prerequisites -->
<script type="text/javascript" src="//cdn.jsdelivr.net/jquery/1/jquery.min.js"/>
<script type="text/javascript" src="//cdn.jsdelivr.net/momentjs/latest/moment.min.js"/>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/bootstrap/latest/css/bootstrap.css" />

<!-- Include Date Range Picker -->
<script type="text/javascript" src="//cdn.jsdelivr.net/bootstrap.daterangepicker/2/daterangepicker.js"/>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/bootstrap.daterangepicker/2/daterangepicker.css" />

Это мой шаблон HTML

<!-- DatePickerTemplate HTML -->
<script type="text/ng-template" id="DatePickerTemplate.html">
  <div ng-controller="DatePickerController">
    <div>Sent On</div>
      <div class="input-group date" datepicker-popup is-open="true"
       ng-model="COL_FIELD"  min-date="2010-01-01">
       <input class="form-control">
       <div class="input-group-addon">
       <span class="glyphicon glyphicon-th"></span>
      </div>
    </div>
  </div>
</script>

Это моя колонка UI GridDefinitons:

{ name: 'Sent On', field: 'SentDateTime', enableCellEdit: false,
  allowCellFocus: false, type: 'date', cellFilter: 'date:"M-d-yy H:mm"',
  headerCellTemplate: 'DatePickerTemplate.html' }

Это моя директива

app.directive("filterDatePicker", function(){
    return {
        restrict: 'E',
        scope: true,
        templateUrl: 'DatePickerTemplate.html'
    };
});

На данный момент у меня есть пустой контроллер, и я хочу сделать в контроллере даты, которые я выбираю из BootStrap DateRangePicker, как только он заработает.

Контроллер

app.controller('DatePickerController', [
    '$scope', function($scope) {
        // return date picked from bootstrap datepicker
    }
]);

GridHeader Когда я нажимаю на маленькое меню, оно ничего не делает. Я также не получаю никаких ошибок в консоли разработчика.

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

Может кто-нибудь, пожалуйста, дайте мне представление о том, где я ошибаюсь. Я не могу открыть BootStrap DatePicker. Я действительно хочу добавить DateRangePicker, а не просто обычный Bootstrap Date Picker.

Планкер фильтра даты


person JEuvin    schedule 23.02.2016    source источник
comment
Вы все переворачиваете ;) Может кто-нибудь, пожалуйста, создайте плунжер или дайте мне представление о том, где я ошибаюсь. Это должно быть: Вот плункер, чтобы вы могли видеть, что он идет не так. Пожалуйста, уделите несколько минут и прочитайте это: минимальный воспроизводимый пример   -  person iH8    schedule 24.02.2016
comment
Я добавил плунжер по предложению iH8.   -  person JEuvin    schedule 24.02.2016
comment
В плункере метки меняются местами? Разве загрузчик не работает с третьим столбцом, а не со вторым (который работает)?   -  person Bennett Adams    schedule 24.02.2016
comment
Спасибо Б.А. Я исправил ярлыки, не понял, что разместил их задом наперед.   -  person JEuvin    schedule 24.02.2016
comment
Не успел полностью разобраться с проблемой, но в плункере был ряд проблем. я разветвил его здесь, и вы можете щелкнуть по вводу средства выбора даты, перейти вниз и посмотреть выпадающий список datepicker сейчас. Во-первых, вы не вводили «ui.bootstrap» в свой модуль, а затем вам нужно следуйте документации, чтобы настроить средство выбора даты. Кроме того, вы вызываете ui-bootstrap 0.10.0 (документы возвращаются только к 0.12.0)... рекомендуется обновить до ^ v1.0.0.   -  person Bennett Adams    schedule 24.02.2016
comment
Б.А. Спасибо за ответ. Я не понимал, что он вызывает неправильную версию бутстрапа. Я делаю это в среде .Net MVC на работе. Я использую NUGet для импорта всех своих зависимостей. Я использую последнюю версию UI-Grid, angular и bootstrap. Вы можете нажать на кнопку в вашем примере. Я просто не вижу всплывающего календаря. Это было проблемой после прыжка.   -  person JEuvin    schedule 24.02.2016


Ответы (1)


Он работает с использованием последних версий Angular (1.5.0), UI-Bootstrap (1.1.2) и UI-Grid (3.1.1) с исправлением некоторых допущенных вами ошибок. Вы забыли внедрить модуль ui.bootstrap в свое приложение и не добавили директиву uib-datepicker-popup в элемент ввода HTML. Также у вас есть прямой доступ к области действия из пользовательского шаблона. Вам нужно добавить префикс grid.appScope к каждому свойству/методу, к которому вы хотите получить доступ в области вашего контроллера:

Вы можете использовать grid.appScope в своем шаблоне строки для доступа к элементам в области вашего контроллера.

http://ui-grid.info/docs/#/tutorial/317_custom_templates

В противном случае это «работает», по крайней мере, до тех пор, пока всплывающее окно открывается на вкладке и когда вы нажимаете кнопку, но оно не будет перекрывать ячейку заголовка, что, возможно, можно решить с помощью CSS, но я оставлю это вам, чтобы выяснить. Надеюсь это поможет. Удачи с вашим проектом. Вот рабочий фрагмент:

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

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

        $scope.gridOptions = {
            enableFiltering: true,
            columnDefs: [{
                field: 'date',
                filterHeaderTemplate: 'DatePicker.html'
            }]
        };
        
        $scope.datePicker = {
            opened: false,
            open: function () {
                $scope.datePicker.opened = true;
            }
        };

    }
]);
#grid {
  width: 100%;
  height: 250px;
}
<!DOCTYPE html>
<html ng-app="App">
    <head>
        <meta charset="utf-8" />
        <title>Angular 1.5.0</title>
        <script>document.write('<base href="' + document.location + '" />');</script>
        <link type="text/css" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
        <link type="text/css" rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.1.1/ui-grid.css" />
        <script type="application/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0/angular.js"></script>
        <script type="application/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/1.1.2/ui-bootstrap-tpls.js"></script>
        <script type="application/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.1.1/ui-grid.js"></script>
        <script type="text/ng-template" id="DatePicker.html">
            <p class="input-group">
                <input type="text" class="form-control" uib-datepicker-popup ng-model="grid.appScope.datePicker.value" is-open="grid.appScope.datePicker.opened" ng-required="true" close-text="Close" />
                <span class="input-group-btn">
                    <button type="button" class="btn btn-default" ng-click="grid.appScope.datePicker.open()">
                        <i class="glyphicon glyphicon-calendar"></i>
                    </button>
                </span>
            </p>
        </script>
    </head>
    <body ng-controller="Controller">
        <div id="grid" ui-grid="gridOptions"></div>
    </body>
</html>

person iH8    schedule 24.02.2016
comment
Я только что внес изменения в плунжер. Это не работает, потому что я уже использую appScopeProvide в определении $scope.gridOptions. Есть способ обойти это, чтобы мое модальное всплывающее окно и календарь начальной загрузки также работали. Спасибо за ответ. - person JEuvin; 24.02.2016
comment
Извините, вы не можете изменить контекст/тему всего вопроса. Ваш вопрос касался таймпикера UI-bootstrap в качестве заголовка в UI-Grid. Как есть, я считаю вопрос решенным. Я предлагаю вам рассмотреть возможность пометить его как таковой. Или дождитесь лучшего ответа. Если у вас есть новый вопрос, опубликуйте новый вопрос с правильным заголовком/контекстом/примером. Я буду рад помочь. Давайте сохраним это полезным для будущих пользователей. - person iH8; 25.02.2016
comment
Я отметил это как ответ и задал новый вопрос в правильном контексте. Пересмотренный вопрос - person JEuvin; 25.02.2016