2014-01-29 1 views
0

가 여기 JSFiddle 내 문제 demostrate하기의 방법 : 내가 하나 명 이상의 관찰 가능한이있는 뷰 모델이 http://jsfiddle.net/jeffreyrswenson/YMFec/7/업데이트하는 방법을 빈 문자열 제어 및 직렬화

합니다. 나는 대부분을 다음과 같이 생성한다 :

var x = ko.observable(); 

입력 요소를 탭하면 값이 정의되지 않음에서 ""로 변경된다. 일부 "Dirtyflag"논리의 일부로 VM을 직렬화하기 때문에 값이 변경되어 일부 문제가 발생합니다.

내가 시도 :

var x = ko.observable(""); 

이 내가 원하는대로 작동하지 않을 수있는 녹아웃 - 검증됩니다.

this.toJSON() 또는 JSON Replacer를 사용하여 JSON을 직렬화하려는 방식으로 직렬화되도록 할 수 있습니다. (나는 이것을 선호한다 .JSON(),하지만 둘 중 하나 또는 둘 모두를 사용할 수있다)

그래서 더 좋은 방법이 있을까? 마찬가지로 입력이 비어있는 경우 Knockout에 값을 정의되지 않은 상태로 남겨 두는 방법이 있습니까?

답변

0

마찬가지로 입력이 공백 인 인 경우 Knockout에 값을 지정하지 않은 상태로 남겨 두는 방법이 있습니까?

바인딩 처리기를 사용하면됩니다. 나는 정의에 빈 문자열을 변환하는 사용자 정의 확장을 만들어 결국 updated fiddle

ko.bindingHandlers.undefinedVal = { 
    init: function (element, valueAccessor, allBindings, viewModel, bindingContext) { 
     var value = valueAccessor(); 
     if (ko.isObservable(value)) { 
      if (value.length === 0) { 
       $(element).text(typeof "undefined"); 
      } else { 
       $(element).text(value); 
      } 
     } 

    } 
}; 
+0

정보 주셔서 감사합니다! 불행히도, 이로 인해 유효성 검사가 작동하지 않게됩니다. 나는 그것이 좋은 생각이라고 생각한다. 나는 그것을 지금 정렬하려고 노력하고있어 ... – Jeff

+0

@Jeff이 [업데이트 된 바이올렛] (http://jsfiddle.net/rwisch45/YMFec/9/) 참조하십시오 - 그것은 사용자 지정 유효성 검사 규칙을 사용하고 있습니다. 'lastName' 입력 필드를 통해 탭 한 후, 'lastName' observable get에'' "'' – rwisch45

+0

@ rwish45 값이 할당 된 경우, 마지막으로 변경 한 내용은 내가 주석으로 지정한 문제를 수정했습니다. 궁극적으로 나는 당신의 대답을 사용하지 않았지만 좋은 정보 였고 마침내 제가 사용했던 것에 도움이되었습니다. – Jeff

0

참조하십시오. 이렇게하면 Validation과 JSON이 필요/예상대로 작동 할 수 있습니다. 나는 그 대답을 수락 한 rwisch445의 대답 @ 사용하지 않았다하더라도 http://jsfiddle.net/jeffreyrswenson/Gwse8/2/

ko.extenders.undefinedIfBlank = function (target, option) { 
    if (option) { 
     var convertBlank = function (newValue) { 
      if (typeof newValue === "string" && newValue.length == 0) { 
       return undefined; 
      } else { 
       return newValue; 
      } 
     }; 

     var result = ko.computed({ 
      read: target, 
      write: function (newValue) { 
       var current = target(); 
       if (newValue !== current) { 
        var convertedVal = convertBlank(newValue); 
        if (convertedVal === undefined) { 
         target.notifySubscribers(newValue); 
        } 
        target(convertedVal); 
       } 
      } 
     }).extend({ notify: 'always' }); 

     var tempVal = convertBlank(target()); 
     target(tempVal); 
     result(target()); 

     return result; 
    } 

    return target; 
}; 

:

다음은 사용자 정의 확장을 보여줍니다 JSFiddle입니다. 그것은 가능한 대답이고 나는 그들이 선호하는 사람들이 될 것이라고 생각합니다.