Angularjs 更改视图值而不更改模型值
我在数据库中以分钟为单位存储我的小时字段,所以我需要更改以小时为单位显示的值 我还没有密码 我考虑了一些备选方案,我想知道是否有人尝试过: 1ª我会将一个指令作为属性,并将该值作为该指令的属性传递,对该值执行我需要的操作,然后将最终值(如15:59)放入元素中 2ª我也将制定一个指令,但该指令将是一个自我控制的元素,当用户输入值时,我将转换为分钟,但在视图中将保留用户输入值 更好的方法是什么?创建一个过滤器Angularjs 更改视图值而不更改模型值,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我在数据库中以分钟为单位存储我的小时字段,所以我需要更改以小时为单位显示的值 我还没有密码 我考虑了一些备选方案,我想知道是否有人尝试过: 1ª我会将一个指令作为属性,并将该值作为该指令的属性传递,对该值执行我需要的操作,然后将最终值(如15:59)放入元素中 2ª我也将制定一个指令,但该指令将是一个自我控制的元素,当用户输入值时,我将转换为分钟,但在视图中将保留用户输入值 更好的方法是什么?创建一个过滤器 app.filter('minutesToHourFormatFilter', func
app.filter('minutesToHourFormatFilter', function() {
return function(input) {
var b = input / 60;
var hours = b.toFixed(0);
var c = (b - hours) * 60;
var minutes = Math.ceil(c)
return hours + "h " + minutes + "m"
}
});
然后在模板中,您可以执行以下操作:
{{ minutes | minutesToHourFormatFilter}}
这取决于您是否需要用户输入。如果需要,则必须使用双向指令,如下所示 在角度指示链接函数中,有4个参数:
function (scope, element, attrs, controller)
控制器参数允许您操作指令的ng模型。最重要的是,控制器有一个叫做$formatters和$parser的东西。这些$formatters和$parser允许您完全执行您要执行的操作,因为它允许您在指令中操作模型和查看值
格式化程序将允许您设置如何在视图中查看模型(初始加载)
解析器将允许您设置如何将视图保存到模型(用户输入)
这可以通过以下方式完成:
directive code
....
link: function (scope, element, attrs, controller) {
function hoursToMinutes(viewValue){
viewValue = ...Conversion logic...
controller.$viewValue = viewValue;
return viewValue;
}
function minutesToHours(modelValue){
modelValue= ...Conversion logic...
controller.$modelValue= modelValue;
return modelValue;
}
controller.$parsers.push(hoursToMinutes);
controller.$formatters.push(minutesToHours);
}
....
从文档中,
解析器
转换视图值
,因此最终有一个不同的模型值。例如用于消毒。格式化程序
不会更改模型本身,而是更改DOM中的外观,就像过滤器
一样。您能解释一下为什么要添加这些行:controller.$viewValue=viewValue代码>和控制器。$modelValue=modelValue代码>是否要调整其他部件?因此,如果模型值更改,则需要更新视图,反之亦然。然后不会controller.$setViewValue(viewValue);控制器。$render()
更好吗?$formatters仅在页面加载时运行$解析器在输入更改时启动。如果要更改视图的值以及用户类型,则需要添加$setViewValue和$render。