AngularJS ng repeat-jquery Datepicker在ng repeat内不工作

AngularJS ng-repeat - jquery Datepicker not working inside ng-repeat

本文关键字:ng 工作 repeat repeat-jquery Datepicker AngularJS      更新时间:2023-09-26

jQuery日期选择器在AngularJS ng重复块内不工作。

不确定ng重复块内的代码生成是否有任何错误。同样的逻辑在ng repeat之外起作用。

工作代码

        <div class="form-group">
            <label class="control-label col-md-4">TEST DATE</label>
            <div class="input-group col-md-2">
                <input type="text" id="testDate" name="testDate" readonly="readonly" class="form-control">
            </div>
        </div>

不工作代码

        <div ng-repeat="reportType in reportTypes">
            <div class="form-group">
                <label class="control-label col-md-4">{{reportType.reportTypeLabel}}</label>
                <div class="input-group col-md-2">
                    <input type="text" id="{{reportType.reportTypeCodeId}}Date" readonly="readonly"
                        class="form-control">
                </div>
            </div>
        </div>

Javascript

// Date picker dd/mm/yyyy
$(function() {
    $("input[id*='date']").datepicker({
        dateFormat : "dd/mm/yy"
    });
});
$(function() {
    $("input[id*='Date']").datepicker({
        dateFormat : "dd/mm/yy"
    });
});

在ng重复结束后使用此指令初始化日期选择器:

angular.module('mymodule').directive('ngOnFinishRender', function ($timeout) {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            if (scope.$last === true) {
                $timeout(function () {
                    scope.$emit(attr.broadcastEventName ? attr.broadcastEventName : 'ngRepeatFinished');
                });
            }
        }
    };
});

在您的控制器中:

$scope.$on('ngRepeatFinished', function(){        
    $("input[id*='date']").datepicker({
        dateFormat : "dd/mm/yy"
    });        
});

在您的视图中,将指令ng-on-finish-render添加到具有ng-repeat:的元素中

<div ng-repeat="reportType in reportTypes" ng-on-finish-render>
        <div class="form-group">
            <label class="control-label col-md-4">{{reportType.reportTypeLabel}}</label>
            <div class="input-group col-md-2">
                <input type="text" id="{{reportType.reportTypeCodeId}}Date" readonly="readonly"
                    class="form-control">
            </div>
        </div>
    </div>

如果您的范围中有一个以上的ng重复,并且它们具有不同的目的,则可以添加broadcast-event-name="myNgRepeatFinished"参数

$scope.$on('myNgRepeatFinished', function(){        
    $("input[id*='date']").datepicker({
        dateFormat : "dd/mm/yy"
    });        
}); 

您必须为日期选择器创建一个自定义指令。

查看

<div ng-app="myApp" ng-controller="myController">
<div ng-repeat="report in repArray">
    <div class="form-group">
        <label>{{report.values.name}}</label>
        <input type="text" datepicker ng-model="datevalue" />
    </div>
</div>

指令

var myApp = angular.module('myApp', []);
myApp.controller('myController', ['$scope', function ($scope) {
    $scope.report = [
        { 'name': 'rep1' },
        { 'name': 'rep2' },
        { 'name': 'rep3' }
    ]
    $scope.repArray = Object.keys($scope.report)
        .map(function (value, index) {
            return { values: $scope.report[value] }
        }
    );
} ]);

myApp.directive("datepicker", function () {
    function link(scope, element, attrs, controller) {
        element.datepicker({
            dateFormat: "dd/mm/yy"
        });
    }
    return {
        require: 'ngModel',
        link: link
    };
});