Я хотел бы знать, как наилучшим образом поддерживать постоянное значение строки отображения и фактическое внутреннее значение директивы.Как сохранить отображаемое значение и внутреннее значение синхронизировано
В приведенном ниже коде у меня есть ввод времени, в котором пользователь может ввести строку, представляющую время («00:00»), директиву вычисляет фактическое значение и устанавливает его соответственно каждый раз, когда пользователь меняет строковое значение.
Однако, поскольку фактическое значение выставлено и может быть изменено другим компонентом, мне нужно каким-то образом сделать строковое значение согласованным с фактическим значением.
$ watch - это одно решение, но тогда мне нужно отключить часы, когда в методе onChange(). Поэтому мне интересно, есть ли лучший способ сделать это.
[EDIT]: Причина, по которой я использую ng-blur, связана с проверкой в случае, если строковое значение не является допустимым форматом, оно возвращается обратно к фактическому значению.
Приветствия,
Jsfiddle: https://jsfiddle.net/minhnq013/v5rax0vk/3/
angular.module('myapp', [])
.directive('timeInput', function() {
return {
restrict: 'E',
template: '<input type="text" ng-model="ctrl.strValue" ng-blur="ctrl.onChange()"/><span ng-bind="ctrl.value"></span>',
scope: {
'value': '='
},
controller: Controller,
controllerAs: 'ctrl',
bindToController: true
};
function Controller() {
var ctrl = this;
ctrl.value = ctrl.value || 0;
ctrl.strValue = "00:00";
/**
* Called when the UI determine user input value has change,
* Set the internal value to be same as user input text value.
**/
function onChange() {
var hour = ctrl.strValue.substr(0, 2);
var minute = ctrl.strValue.substr(3);
var dateObj = new Date(ctrl.value);
var regex = new RegExp("^\\d{2}:\\d{2}$");
// If format is not valid, revert to last value
if (!ctrl.strValue.match(regex)) {
ctrl.strValue = ("0"+dateObj.getUTCHours()).slice(-2) + ":" + ("0"+dateObj.getUTCMinutes()).slice(-2);
return;
}
dateObj.setUTCHours(hour);
dateObj.setUTCMinutes(minute);
ctrl.value = dateObj.getTime();
}
ctrl.onChange = onChange;
function filterText() {
}
}
});
Ваше предложение заставляет меня думать о двухстороннем фильтре. Так как мне нужно разрешить пользователю изменять текстовое значение, которое также изменяет фактическое значение. Вызвать его значение отображаемого текста было не очень умно меня. – MikeNQ
@MikeNQ, каковы текущие внутренние и отображаемые форматы? –
Это как в jsfiddle, формат String - «hh: mm» для представления времени. Хотя фактическое значение представляет собой миллисекунду целочисленного значения в формате UTC. – MikeNQ