我试图将时间值拆分为两个分量,时间和子午线,但将它们都链接到同一个ng模型值。我的想法是为这些值设置验证器,这些验证器将相应地格式化和解析这些值。但我似乎无法设置验证器指令中选择框的选定选项。
我有一个选择,我已经填充了以下阵列
$scope.timeMeridians = [ {id:'am', value:'AM'},
{id:'pm', value:'PM'}];
指令如下
<select ng-model="editingEvent.start_date_time"
ng-options="option as option.value for option in timeMeridians"
ub-meridian-validator>
以及迄今为止的验证器骨架。。。
angular.module('app.MeridianValidator',[])
.directive('ubMeridianValidator',function($timeout){
return {
require: 'ngModel',
link: function(scope, elem, attrs, ctrl){
var valueType;
// sets model based on view
ctrl.$parsers.unshift(function(viewValue){
return moment().format('YYYY-MM-DD HH:mm Z');
});
// set the view format
ctrl.$formatters.unshift(function(viewValue){
return scope.timeMeridians[0];
});
}
};
注意:我现在已经对选择逻辑进行了硬编码,直到我看到值发生变化。
因此,基本上目前,无论传递给它什么值,viewValue格式化程序都应该返回timeMeridians[0](即"AM"),但我不会更改视图中的值。。。
我在它旁边创建了一个输入,并将其连接起来以复制操作,所有更改都显示在那里,而且这种通过引用timeMeridians数组中的位置来设置选择值的方法在控制器中运行良好,所以为什么不在formatter指令中呢?
请帮助:)
我后来意识到这是对Angular JS格式化程序的错误使用。实现这一点的正确或更好的方法是使用ng更改指令,该指令将调用控制器函数来执行更新。如果你一心想保留相对控制器的这个功能,从而使时间输入可重复使用,那么你应该用它自己的控制器将这个功能封装到一个指令中。