在输入元件使用angularjs滤波器(Using angularjs filter in inpu

2019-07-21 08:10发布

我希望我没有错过在DOCO什么明显的,如果我有我敢肯定有人会帮。

我使用asp.net的WebAPI返回一个DTO,与日期字段。 这些是使用JSON.Net序列化(在格式 '2013-03-11T12:37:38.693')。

我想使用的过滤器,但在INPUT元素,这是可能的,或者我应该创建一个新的过滤器或指令来完成这项工作?

// this just displays the text value
<input ui-datetime type="text" data-ng-model="entity.date" /> 
// this doesn't work at all
<input ui-datetime type="text" data-ng-model="{{entity.date|date:'dd/MM/yyyy HH:mm:ss a'}}" /> 
// this works fine
{{entity.date|date:'dd/MM/yyyy HH:mm:ss a'}}

有我缺少什么捷径?

Answer 1:

简而言之:如果你希望你的数据在视图和模型中的不同表现,你需要一个指令 ,你可以认为的双向过滤器

你的指令会看起来像

angular.module('myApp').directive('myDirective', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ngModelController) {
      ngModelController.$parsers.push(function(data) {
        //convert data from view format to model format
        return data; //converted
      });

      ngModelController.$formatters.push(function(data) {
        //convert data from model format to view format
        return data; //converted
      });
    }
  }
});

HTML:

<input my-directive type="text" data-ng-model="entity.date" /> 

这里是一个工作的jsfiddle例子。



Answer 2:

在你的输入字段,并在你的模型具有不同价值观违背NG-模型的本质。 因此,我建议你采取最简单的方法,并应用在控制器内部的过滤器,使用单独的变量格式化的日期,并采用观察家保持格式化和原始日期同步:

HTML:

<input ui-datetime type="text" data-ng-model="formattedDate" />

JS:

app.controller('AppController', function($scope, $filter){

  $scope.$watch('entity.date', function(unformattedDate){
    $scope.formattedDate = $filter('date')(unformattedDate, 'dd/MM/yyyy HH:mm:ss a');
  });

  $scope.$watch('formattedDate', function(formattedDate){
    $scope.entity.date = $filter('date')(formattedDate, 'yyy/MM/dd');
  });

  $scope.entity = {date: '2012/12/28'};

});


Answer 3:

如果输入只显示数据

如果你确实需要一个输入简单地显示一些信息,它是改变角度模式可以让一个更简单的改变一些其他的元素。

而不是写新指令的根本不使用 ng-model ,并使用好,旧的value

因此,而不是:

<input data-ng-model={{entity.date|date:'dd/MM/yyyy HH:mm:ss'}}" /> 

这将做到:

<input value="{{entity.date|date:'dd/MM/yyyy HH:mm:ss'}}" /> 

而且就像一个魅力:)



Answer 4:

该格式化的数字,插入空格每3个字符,从端部开始完整的例子:

'use strict'
String::reverse = ->
  @split('').reverse().join('')

app = angular.module('app', [])
app.directive 'intersperse', ->
  require: 'ngModel'
  link: (scope, element, attrs, modelCtrl) ->
    modelCtrl.$formatters.push (input) ->
      return unless input?
      input = input.toString()
      input.reverse().replace(/(.{3})/g, '$1 ').reverse()
    modelCtrl.$parsers.push (input) ->
      return unless input?
      input.replace(/\s/g, '')

用法:

<input ng-model="price" intersperse/>

Plunkr例如: http://plnkr.co/edit/qo0h9z



Answer 5:

角已建成日期格式的功能,但将它应用到一个输入,你最终会希望得到的原始(未格式化的)日期,你需要创建一个自定义的指令 。

例如指令:

(function () {
    'use strict';

    angular.module('myApp').directive('utcDate', ['$filter', function ($filter) {
        return {
            restrict: 'A', //restricting to (A)ttributes
            require: 'ngModel',
            link: function (scope, elem, attrs, model) {
                if (!model) return;

                var format = 'MM/dd/yyyy h:mm:ss a';
                var timezone = 'UTC';

                //format the date for display
                model.$formatters.push(function (value) {
                    //using built-in date filter
                    return $filter('date')(value, format, timezone);
                });

                //remove formatting to get raw date value
                model.$parsers.push(function (value) {
                    var date = Date.parse(value);
                    return !isNaN(date) ? new Date(date) : undefined;
                });
            }
        };
    }]);
})();

然后应用它:

<input type="text" ng-model="$ctrl.DateField" utc-date />


Answer 6:

你不会需要从零创建一个新的过滤器,因为角早已内置过滤器的日期类型。 http://docs.angularjs.org/api/ng.filter:date

我相信这正是你需要的。



文章来源: Using angularjs filter in input element