在input元素中使用angularjsfilter
我希望我没有遗漏任何明显的东西,如果我有我相信有人会帮助。
我正在使用asp.net webapi返回一个DTO,带有date字段。 这些序列化使用JSON.Net(格式为“2013-03-11T12:37:38.693”)。
我想使用一个filter,但在一个INPUT元素,这是可能的,或者我应该创build一个新的filter或指令来完成这个?
// 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'}}
有什么捷径我错过了吗?
简而言之:如果您希望数据在视图和模型中具有不同的表示forms,则需要一个指令 ,您可以将其视为双向filter 。
你的指令看起来像
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的例子。
在你的input领域和你的模型中有不同的价值观是违背ng模型的本质的。 所以我build议你采取最简单的方法,并在控制器中应用你的filter,使用单独的variables格式化date,并雇用观察者保持格式化和原始date同步:
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'}; });
如果你的input只显示数据
如果你真的需要一个input来简单地显示一些信息,而且它是改变 Angular模型的其他元素,那么你可以做出一个更容易的改变。
不要简单地写新指令, 不要使用 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'}}" />
而作品就像一个魅力:)
格式化数字的完整示例,从结尾开始每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/>
普朗克例如: http ://plnkr.co/edit/qo0h9z
你不需要从零开始创build一个新的filter,因为angular已经有了一个内置的datetypesfilter。 http://docs.angularjs.org/api/ng.filter:date
我相信这正是你所需要的。