【问题标题】:AngularJS - Formatting ngModel on custom datepicker directiveAngularJS - 在自定义日期选择器指令上格式化 ngModel
【发布时间】:2014-03-03 17:06:22
【问题描述】:

我在 Angular 应用程序中使用 JQuery 引导日期选择器 (eternicode.github.io/bootstrap-datepicker/)。

我已经编写了自己的指令来包装这个日期选择器并进行一些日期格式设置。 Datepicker 工作正常并显示适当的日期格式。

目前,我想显示一个格式化的日期值,并将一个时间戳格式化的值放入 ngModel

当我不尝试在指令中使用模板时,我的代码还可以:

cosyApp.directive("datepicker", ['moment',
    function(moment) {

        function link($scope, element, attrs, ctrl) {    
            // Init JQuery datepicker
            element.datepicker();

            ctrl.$parsers.push(function(valueFromInput) {
                // Format displayed value in timestamp format
                return moment(valueFromInput).format('X');
            });

        }
        return {
            restrict: 'A',
            require: 'ngModel',
            link: link
        };
    }
]);

但是当我使用模板属性时,ngModel和显示的值是一样的:

return {
    restrict: 'A',
    replace: true,
    require: 'ngModel',
    template: "<div class='input-group date'> {{ngModel}}" +
                "<input class='form-control' ng-model='ngModel'>" +
                "<span class='input-group-addon'><i class='glyphicon glyphicon-calendar'></i></span>" +
            "</div>",
    link: link
};

【问题讨论】:

  • 你能做一个JSFiddle或Plunker吗?
  • 这里的代码更清晰:http://plnkr.co/edit/9fojEhcxoBEbUkrtGGnQ?p=preview 请注意,Plunker 会在这个 Plunker 中自动显示打开的日期选择器,我不知道为什么...
  • 我做了一些更改。我没有试图弄清楚为什么日历会立即显示,而是将日期选择器绑定到输入字段。这是你要找的吗? plnkr.co/edit/5213zUvnqyv0ARqc11aU?p=preview
  • 是的,没关系!你让我开心,谢谢!你能发布你的答案吗?我会为此投票。

标签: angularjs parsing templates datepicker directive


【解决方案1】:

我对你的 plunker 做了一些改动。我没有试图弄清楚为什么日历会立即显示,而是将日期选择器绑定到输入字段。

我没有像您那样尝试直接在输入 ng-mode 上使用 ngModel,而是创建了一个中间模型对象,然后添加了一个函数来监视输入的更改并将这些更改直接传递给 ngModelController。

旁注,我相信如果您计划在 UI 之外更新模型值并希望它更新视图,则必须添加 $watch 来更新中间模型对象。

http://plnkr.co/edit/5213zUvnqyv0ARqc11aU?p=preview

cosyApp.directive("datepickerx",
    function($window) {

        function link($scope, element, attrs, ctrl) {    
            $scope.model = ctrl.$viewValue;
            // Init JQuery datepicker
            element.find('input').datepicker({
                autoclose: true,
                clearBtn: true,
            });  

            $scope.changed = function() {
              ctrl.$setViewValue($scope.model);
            }

            ctrl.$parsers.push(function(valueFromInput) {
                // Format displayed value in timestamp format and store it to ngModel
                return $window.moment(valueFromInput).format('X');
            });

        }

        /* ********** This part of code doesn't works ********** */

        return {
          restrict: 'A',
          replace: true,
          require: 'ngModel',
          scope: {
              ngModel: '='
          },
          template: '<div class="input-group date">' +
                        '<input class="form-control" ng-model="model" ng-change="changed()"/>' +
                        '<span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span>' +
                    '</div>',
          link: link
        };

    }
);

【讨论】:

  • 我对这个解决方案还有另一个问题。您正在将 datepicker 指令应用于
    。如果我想以与第一个示例相同的方式将其应用于 怎么办?
  • 有什么想法吗?如果我可以在 而不是
    上声明我的指令,那就太棒了
  • 我不确定我是否理解。您的第一个示例已经在 上工作。你想做什么不同的事情?
  • 在您的工作示例中,您在
    元素上使用了“datepickerx”指令。我想用 来改变它,但它不起作用。
  • 如果您删除模板并将 element.find('input').datepicker() 更改为 element.datepicker() 那么我认为它会起作用。
猜你喜欢
相关资源
最近更新 更多
热门标签