앱 논리가 매우 단순한 한 이전 접근법은 괜찮습니다. 솔루션이 View Model의 값을 망치고 있다는 것을 알아 두십시오.이 값은 관찰 가능하고 구독 또는 계산에 연결할 수 있으므로 값을 변경하여 View Model을 변경하십시오. View Model을 업데이트하지 않고 다른 해결책을 제시해 드리겠습니다.
ko.bindingHandlers.fakePlaceHolderWhenNeedIt = {
init: function (element, valueAccessor, allBindings, vm) {
if (!Modernizr.input.placeholder) {
var placeHolderVal = $(element).attr("placeholder");
if (placeHolderVal != null || placeHolderVal != '') {
var $element = $(element);
var value = valueAccessor()
var valueUnwrapped = ko.utils.unwrapObservable(value);
$element.keyup(function() {
var inputValue = $(this).val();
var $watermark = $(this).prev('.ie-placeholder');
if (inputValue == null || inputValue == '') {
$watermark.show();
}
else {
$watermark.hide();
}
});
var display = valueUnwrapped != null || valueUnwrapped != '' ? "block" : "none";
var left = $element.position().left;
var top = $element.position().top;
var paddingLeft = $element.css('padding-left');
var paddingRight = $element.css('padding-right');
var paddingTop = $element.css('padding-top');
var paddingBottom = $element.css('padding-bottom');
var height = $element.css('height');
var placeHolder = '<div class="ie-placeholder" style="position:absolute;left:' + left + ';top:' + top + ';padding-top: ' + paddingTop + ';padding-bottom: ' + paddingBottom + ';padding-left: ' + paddingLeft + ';padding-right: ' + paddingRight + ';height: ' + height + ';line-height:' + height + ';display:' + display + ';">' + placeHolderVal + '</div>';
$(placeHolder).click(function() { $element.focus(); }).insertBefore(element);
}
}
},
update: function (element, valueAccessor, allBindings, vm) {
if (!Modernizr.input.placeholder) {
var placeHolderVal = $(element).attr("placeholder");
if (placeHolderVal != null || placeHolderVal != '') {
var $element = $(element);
var value = valueAccessor()
var valueUnwrapped = ko.utils.unwrapObservable(value);
var $watermark = $element.prev('.ie-placeholder');
if (valueUnwrapped == null || valueUnwrapped == '') {
$watermark.show();
}
else {
$watermark.hide();
}
}
}
}
예, allBindingsAccessor를 사용하기 전에 변경 한 내용과 거의 같습니다. 초기 값을 설정할 때'setTimeout'을 놓치고있었습니다. 왜 그것이 필요한지 간단히 설명해 주시겠습니까? 더 좋은 방법이 있다면 또한 아십니까? 또는 이것이 (전체 솔루션 측면에서) 좋은 (충분한) 방법이라고 생각합니까? 예를 들어, hasfocus 바인딩 (built-in)이 있음을 알 수 있습니다. 그게 더 좋은 방법일까요? – Robbie
이전 브라우저를 지원하려면이 방법이 좋다고 생각합니다. 새로운 것들을 위해서 단지 자리 표시 자 속성을 사용하십시오. 내부적으로 KO는 입력 값을 설정하기 전에 setTimeout을 사용하기 때문에 setTimeout이 필요합니다. 이것은 KO 코드가 값을 설정하기 전에 코드가 실행 중이 었음을 의미하므로 setTimeout을 다시 사용하여 코드가 실행 마지막에 오도록해야합니다. – madcapnmckay
설명과 도움에 감사드립니다. – Robbie