2016-07-26 2 views
1

사전에 사과드립니다. 지침이 내 강한 의도는 아닙니다!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: '=' 
} 

하지만 아무 짓도 안 했어요 :

나는 사용하여 시도했다. 내가 모델과 뷰 모두를 확인하기 위해 추가해야 할 동기화에 남아 어떤 그렇다면

나는이 올바른 방법으로 일을하고 있나요? 나는이 길을 잘못했을 경우

, 어떻게 제대로 할 수있는 가장 좋은 방법이 될 것입니다?

+0

을 같이 하는가? –

+0

'isValid'는 값들이 유효한지 확인하기위한 몇 가지 함수를 공개하는 팩토리입니다. 'isValid.time()'은 HH : mm 문자열에 대한 단순한 정규 표현식입니다. 흥미롭게도 이것은 문제가있는 곳입니다. 'isValid.time()'은 뷰가 위의 지시문에서 렌더링 될 때 true를 반환합니다. 그러나 컨트롤러 모델'isValid.time()'을 테스트하려 할 때 false를 반환하고 모델에 미리 포맷 된 값이 들어 있음을 보여줍니다. . 대신 ngModel $ viewValue = formattedVal이'의 –

+0

,'시도'ngModel $ setViewValue (formattedVal)하며 ngModel를 설정하는 일반 모델 파이프 라인을 통해 값을 실행해야합니다'.. –

답변

1

문제는 각도가 등록 $ 파서 및 $ 유효성 검사기를 통해 실행 포함하는 modelValue을 설정하는 데 사용되는 파이프 라인을 가지고이 줄 ngModel.$viewValue = formattedVal;에있다. 값을 설정하는 올바른 방법은이 파이프 라인을 통해 값을 실행할 $setViewValue(formattedVal)을 호출하는 것입니다. isValid 서비스 란 무엇

+0

고맙다! 나는 이미 이것을 시도했지만 작동하지 않지만 구문이 틀렸다 :'ngModel. $ setViewValue = formattedVal;' –

관련 문제