在input元素中使用angularjs过滤器

leo*_*eon 73 asp.net-web-api angularjs angularjs-directive

我希望我没有错过任何明显的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'}}
Run Code Online (Sandbox Code Playgroud)

我有什么捷径可走吗?

hol*_*ple 131

简而言之:如果您希望数据在视图和模型中具有不同的表示,则需要一个指令,您可以将其视为双向滤波器.

你的指令看起来像

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
      });
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

HTML:

<input my-directive type="text" data-ng-model="entity.date" /> 
Run Code Online (Sandbox Code Playgroud)

这是一个有效的jsFiddle示例.

  • 看起来不错,但你会如何申请呢?具体来说,如何指定用于格式化的过滤器? (5认同)

Ste*_*wie 20

在输入字段和模型中使用不同的值违背了ng-model的本质.因此,我建议您采用最简单的方法并在控制器中应用过滤器,使用单独的变量进行格式化日期,并使用观察者保持格式化和原始日期同步:

HTML:

<input ui-datetime type="text" data-ng-model="formattedDate" />
Run Code Online (Sandbox Code Playgroud)

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'};

});
Run Code Online (Sandbox Code Playgroud)

  • 我相信创建一个满足要求的新指令是一个更清洁的解决方案.如果我正确理解了OP的问题. (6认同)
  • -1,两个变量+观看是支持地狱.想象一个带有几十个变量的范围(保险计算器等) (3认同)

Ata*_*ais 16

如果您的输入仅显示数据

如果您确实需要一个输入来简单地显示一些信息,并且它是更改 Angular模型的其他元素,您可以更容易地进行更改.

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

所以代替:

<input data-ng-model={{entity.date|date:'dd/MM/yyyy HH:mm:ss'}}" /> 
Run Code Online (Sandbox Code Playgroud)

这样做:

<input value="{{entity.date|date:'dd/MM/yyyy HH:mm:ss'}}" /> 
Run Code Online (Sandbox Code Playgroud)

像魅力的工作:)

  • 我喜欢这种方式,简单而愚蠢! (2认同)