只要您的應用程序邏輯非常簡單,請注意解決方案正在混淆您的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綁定(內置)。這可能是一個更好的方法嗎? – Robbie
我認爲這種方法很好,如果你想支持舊瀏覽器。對於新的只使用佔位符屬性。 setTimeout是需要的,因爲內部KO在設置輸入值之前使用setTimeout。這意味着您的代碼在KO代碼設置值之前運行,因此您需要setTimeout來再次確保您的代碼在執行過程中最後出現。 – madcapnmckay
非常感謝您的解答和幫助。 – Robbie