如何将 Bootstrap-datepicker 元素与 angularjs ng-model 绑定?

IT技术 javascript jquery twitter-bootstrap angularjs datepicker
2021-02-23 01:06:19

这是日期字段的html:

<div class='form-group'>
  <label>Check out</label>
    <input type='text' ng-model='checkOut' class='form-control' data-date-format="yyyy-mm-dd" placeholder="Check out" required id="check-out">
</div>
<script>
$('#check-out').datepicker();
</script>

日期选择器显示在输入字段中。但是,如果我在控制器中执行此操作:

console.log($scope.checkOut);

我明白了undefined in the javascript console如何解决这个问题?
有没有办法使用更好的方法bootstrap-datepickerangularjs

我不想使用,angular-ui/angular-strap因为我的项目充斥着 javascript 库。

6个回答

正如@lort 所建议的,您无法从控制器访问 datepicker 模型,因为 datepicker 有自己的私有范围。

如果你设置: ng-model="parent.checkOut"

并在控制器中定义: $scope.parent = {checkOut:''};

您可以使用以下方式访问日期选择器: $scope.parent.checkOut

这个问题让我很头疼——查看isolateScope以获得更好的理解
2021-05-03 01:06:19
我不太明白你的回答,我们应该写你写的同样的东西吗?或在父 div 中设置 ng-model 指令
2021-05-08 01:06:19
@lort 的 ng-model="$parent.checkOut" 建议对我有用。
2021-05-16 01:06:19

我正在使用 bootstrap 3 datepicker https://eonasdan.github.io/bootstrap-datetimepicker/和 angularjs,我对 ng-model 有同样的问题,所以我使用 bootstrap jquery 函数获取输入日期值,下面是代码我的控制器,它对我有用。

html

<input class="form-control" name="date" id="datetimepicker" placeholder="select date">

控制器

$(function() {

    //for displaying datepicker

    $('#datetimepicker').datetimepicker({
        viewMode: 'years',
        format: 'DD/MM/YYYY',
    });

    //for getting input value

    $("#datetimepicker").on("dp.change", function() {

        $scope.selecteddate = $("#datetimepicker").val();
        alert("selected date is " + $scope.selecteddate);

    });

 });
只是想说这是唯一接近为我工作的答案。+1 并感谢
2021-04-21 01:06:19
截至 2018 年 2 月,这仍然是最好的解决方法,我现在无法表达这对我的帮助有多大。
2021-05-06 01:06:19
这对我有用,除了调用 val() 不起作用的小例外。该事件接收一个包含新日期的“e”参数(作为一个时刻实例),所以我的代码是 $scope.selecteddate = e.date.toDate();
2021-05-07 01:06:19

我自己刚刚找到了解决方案。我只是将模型名称传递给指令(我在网上找到了大部分)。这将在日期更改时设置模型的值。

<input data-ng-model="datepickertext" type="text" date-picker="datepickertext" />{{datepickertext}}    

angular.module('app').directive('datePicker', function() {
    var link = function(scope, element, attrs) {
        var modelName = attrs['datePicker'];
        $(element).datepicker(
            {
                onSelect: function(dateText) {
                    scope[modelName] = dateText;
                    scope.$apply();
                }
            });
    };
    return {
        require: 'ngModel',
        restrict: 'A',
        link: link
    }
});

我正在使用来自https://eonasdan.github.io/bootstrap-datetimepicker/ 的Angular JS 1.5.0 和 Bootstrap 3 Datetimepicker

经过一段时间和挣扎,我终于找到了一个解决方案,如何让它为我工作:)

JSFiddle:http : //jsfiddle.net/aortega/k6ke9n2c/

HTML代码:

  <div class="form-group col-sm-4" >
     <label for="birthdate" class="col-sm-4">Birthday</label>
     <div class="col-sm-8">
       <div class="input-group date" id="birthdate"  ng-model="vm.Birthdate" date-picker>
         <input type="text" class="form-control netto-input"  ng-model="vm.Birthdate" date-picker-input>

         <span class="input-group-addon">
           <span class="glyphicon glyphicon-calendar"></span>
         </span>
       </div>
     </div>
  </div>
 <div class="form-group col-sm-4">
     <label for="birthdateText" class="col-sm-4">Model:</label>
     <div class="col-sm-8">
         <input type="text" class="form-control netto-input"  ng-model="vm.Birthdate">
     </div>
  </div>
</body>

应用程序.js:

只是一个设置 viewmodels Birtdate 属性的控制器:

var app = angular.module('exampleApp',[]);

app.controller('ExampleCtrl',  ['$scope', function($scope) {
    var vm = this;
    vm.Birthdate = "1988-04-21T18:25:43-05:00";
}]);

第一个指令是初始化datetimepicker并监听 dp.change 事件。

更改时 - ngModel 也会更新。

// DatePicker -> NgModel
app.directive('datePicker', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attr, ngModel) {
            $(element).datetimepicker({
                locale: 'DE',
                format: 'DD.MM.YYYY',
                parseInputDate: function (data) {
                    if (data instanceof Date) {
                        return moment(data);
                    } else {
                        return moment(new Date(data));
                    }
                },
                maxDate: new Date()
            });

            $(element).on("dp.change", function (e) {
                ngModel.$viewValue = e.date;
                ngModel.$commitViewValue();
            });
        }
    };
});

第二个指令是观察 ngModel,并在更改时触发输入 onChange 事件。这也将更新datetimepicker视图值。

// DatePicker Input NgModel->DatePicker
app.directive('datePickerInput', function() {
    return {
        require: 'ngModel',
        link: function (scope, element, attr, ngModel) {
            // Trigger the Input Change Event, so the Datepicker gets refreshed
            scope.$watch(attr.ngModel, function (value) {
                if (value) {
                    element.trigger("change");
                }
            });
        }
    };
});

我有同样的问题并像这样解决

添加在 html 部分

<input class="someting" id="datepicker" type="text" placeholder="Dae" ng-model=""/>

和简单的控制器调用

$scope.btnPost = function () {

          var dateFromHTML = $('#datepicker').val();