사전에 사과드립니다. 지침이 내 강한 의도는 아닙니다!Angular 지시어에서 모델과 뷰 값을 모두 업데이트하는 방법은 무엇입니까?
필드에있는 문자열을 blur
필드에 자동으로 HH : mm 형식으로 변환하는 데 사용되는 간단한 특성 전용 지시문이 있습니다.
(function() {
'use strict';
angular
.module('app.format-as-time')
.directive('formatAsTime', timeDirective);
timeDirective.$inject = [
'isValid'
];
function timeDirective (isValid) {
return {
require: 'ngModel',
restrict: 'A',
link: LinkFunction
};
function LinkFunction (scope, elem, attrs, ngModel) {
elem.bind('blur', function() {
var currentVal = ngModel.$modelValue,
formattedVal = '';
// Format something like 0115 to 01:15
if (currentVal.length === 4) {
formattedVal = currentVal.substr(0, 2) + ':' + currentVal.substr(2, 2);
// Format something like 115 to 01:15
} else if (currentVal.length === 3) {
formattedVal = '0' + currentVal.substr(0, 1) + ':' + currentVal.substr(1, 2);
// Format something like 15 to 00:15
} else if (currentVal.length === 2) {
formattedVal = '00:' + currentVal;
}
// If our formatted time is valid, apply it!
if (isValid.time(formattedVal)) {
scope.$applyAsync(function() {
ngModel.$viewValue = formattedVal;
ngModel.$render();
});
}
});
}
}
}());
및 관련보기 :
<div ng-controller="TestController as test">
<input type="text"
maxlength="5"
placeholder="HH:mm"
ng-model="test.startTime"
format-as-time>
<button ng-click="test.getStartTime()">Get Start Time</button>
</div>
및 관련 컨트롤러 : 지시어 인 뷰하지만 모델에 대한 예상대로
(function() {
'use strict';
angular
.module('app.testModule')
.controller('TestController', TestController);
function TestController() {
var vm = this;
vm.startTime = '';
vm.getStartTime = function() {
console.log(vm.startTime);
}
}
}());
현재, 지시어 작동 내 컨트롤러가 업데이트되지 않습니다에, 입력이 01:15이 포함됩니다 즉,하지만 모델 것이다 console.log()
(115)
scope: {
ngModel: '='
}
하지만 아무 짓도 안 했어요 :
나는 사용하여 시도했다. 내가 모델과 뷰 모두를 확인하기 위해 추가해야 할 동기화에 남아 어떤 그렇다면
나는이 올바른 방법으로 일을하고 있나요? 나는이 길을 잘못했을 경우
, 어떻게 제대로 할 수있는 가장 좋은 방법이 될 것입니다?
을 같이 하는가? –
'isValid'는 값들이 유효한지 확인하기위한 몇 가지 함수를 공개하는 팩토리입니다. 'isValid.time()'은 HH : mm 문자열에 대한 단순한 정규 표현식입니다. 흥미롭게도 이것은 문제가있는 곳입니다. 'isValid.time()'은 뷰가 위의 지시문에서 렌더링 될 때 true를 반환합니다. 그러나 컨트롤러 모델'isValid.time()'을 테스트하려 할 때 false를 반환하고 모델에 미리 포맷 된 값이 들어 있음을 보여줍니다. . 대신 ngModel $ viewValue = formattedVal이'의 –
,'시도'ngModel $ setViewValue (formattedVal)하며 ngModel를 설정하는 일반 모델 파이프 라인을 통해 값을 실행해야합니다'.. –