我的表单数据是从REST调用返回的。示例数据是:
{
id: 4
version: 3
code: "ADSFASDF"
definition: "asdflkj"
value: "1234"
active: "false"
formula: false
validTo: "2014-12-31T05:00:00"
validFrom: "2010-12-31T10:00:00"
}
我在使用input[number]
和input[date]
字段时遇到了麻烦,因为它们要求数据分别是数字或日期而不是字符串。布尔值(复选框)等也会出现类似的问题。
我以为我可以使用$formattter
绕过它,但传递给格式化程序的值总是“”。我认为这意味着在Angular已经尝试解析数据模型之后调用$formatter
。
无需最初在控制器中投射所有内容,是否有办法通过指令或HTML标签直接投射数据?
例如:
<input type="number" class="form-control" ng-model="charge.value" jk-numeric id="chargeValue"/>
$格式化器:
app.directive( 'jkNumeric',
function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModelCtrl) {
var stringToNum = function(text) {
if( angular.isNumber(text) )
return text;
else
return parseInt( text, 10);
}
// assign the parser and the formatter to the model
ngModelCtrl.$formatters.unshift(stringToNum);
}
};
});
答案 0 :(得分:2)
你可以这样做: -
将指令设置为更高优先级,以便指令在ng-model
进行viewValue
/ modelValue
评估之前运行,并执行 2与ngModel
绑定以获取您设置的实际值(而不是ngModel 的 viewValue),并支持异步数据分配保留临时监视。您无法使用formatters
执行该操作,因为它们会在ngModel
评估该值后运行。
.directive( 'jkNumeric',
function() {
return {
restrict: 'A',
require: 'ngModel',
priority:999999, //<-- Give a higher priority
scope: {
model:'=ngModel' //<-- A 2 way binding to read actual bound value not the ngModel view value
},
link: function(scope, element, attrs, ngModelCtrl) {
//Perform whatever formatting you want to do.
function stringToNum(text) {
return +text;
}
var unwatch = scope.$watch('model', function(val){
if(!val) return;
ngModelCtrl.$setViewValue(stringToNum(val));
ngModelCtrl.$render();
unwatch();
});
}
};
});
<强> Plnkr 强>
另一种观察方式是观察ngModel属性的评估值。
require: 'ngModel',
priority:999999,
link: function(scope, element, attrs, ngModelCtrl) {
function formatToNumber(text) {
//do something and return numeric value
}
scope.$watch(function(){
return scope.$eval(attrs.ngModel); //evaluate the scope value
}, function(val){
if(!val) return;
ngModelCtrl.$setViewValue(formatToNumber(val));
ngModelCtrl.$render();
});
<强> Plnk2 强>
答案 1 :(得分:1)
你可以试试像:
app.directive( 'jkNumeric',
function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModelCtrl) {
if (angular.isString(ngModelCtrl.$viewValue) {
ngModelCtrl.$setViewValue(parseInt(ngModelCtrl.$viewValue, 10));
ngModelCtrl.$render();
}
}
};
});