這個答案是明確如何集中視圖的第一input
當增加一個新的模式,因爲這種技術,我建議因爲這樣做與你的完全不同。
我在最近的一個項目中有同樣的要求,基本上通過在我的視圖模型中包含一個名爲firstHasFocus
的可觀察項來解決它。無論何時該視圖模型要變爲活動狀態,例如切換「標籤」時,我會將firstHasFocus
設置爲true
。在該視圖中,第一個input
綁定到使用hasfocus
的可觀察值。
下面是我的代碼中的一個示例,它響應嚮導類型界面中的「下一步」按鈕。它切換到下一步,如果這是當前最後一個可用步驟,則它會將第一個輸入聚焦。
this.goNext = function() {
if (this.isNextAvailable()) {
var newIndex = this.currentStepIndex() + 1;
this.setCurrentStep(this.steps()[newIndex], newIndex);
if (!this.isNextAvailable()) {
this.currentStep().firstHasFocus(true);
}
}
};
爲了確保firstHasFocus(true)
始終更新的結合,它的定義總是通知:
this.firstHasFocus = ko.observable(false).extend({notify: 'always'});
每一步都有相應的觀點,即可以包括結合firstHasFocus
。
<h1>Select the Station Info Columns</h1>
<form>
<label for="stationColumn">Station Name</label>
<select id="stationColumn" name="stationColumn" data-bind="
options: data.headerVarNames, optionsCaption: '----',
value: data.stationHeaderName, valueUpdate: 'afterkeydown',
setfocus: firstHasFocus"></select>
<label for="siteColumn">Site Name</label>
<select id="siteColumn" name="siteColumn" data-bind="
options: data.headerVarNames, optionsCaption: '----',
value: data.siteNameHeaderName"></select>
...
我使用的是自定義綁定,setfocus
,而不是標準的hasfocus
,因爲再也不想blur
被調用。這是我的setfocus
裝訂:
ko.bindingHandlers.setfocus = {
init: function(element, valueAccessor) {
var modelValue = valueAccessor();
if (!ko.isWriteableObservable(modelValue)) {
throw new Error('setfocus must be used with a writable observable');
}
var writeValue = function(event) {
var modelValue = valueAccessor(),
valueToWrite = element.ownerDocument.activeElement === element;
if (event.type == 'focusin' && !valueToWrite)
element.focus();
else if (valueToWrite != modelValue())
modelValue(valueToWrite);
};
ko.utils.registerEventHandler(element, "focus", writeValue);
ko.utils.registerEventHandler(element, "focusin", writeValue); // For IE
ko.utils.registerEventHandler(element, "blur", writeValue);
},
update: function(element, valueAccessor) {
var value = valueAccessor()(); // access and unwrap observable
setTimeout(function() {
if (value && element.offsetWidth && element.offsetHeight && document.activeElement && document.activeElement != element) {
element.focus();
ko.utils.triggerEvent(element, "focusin"); // For IE, which doesn't reliably fire "focus" or "blur" events synchronously
}
});
}
};
謝謝邁克爾。有沒有更好的方法來完成我想要做的事情?例如。當一個新模型被添加到'observableArray'中時,我想自動對焦模型的第一個'輸入',以便用戶可以立即開始輸入。我不認爲這會適用於任何現有的綁定。 – 2013-04-25 12:31:20
你可以添加到你的問題?然後我可以添加一個關於它的不同答案。 – 2013-04-25 20:12:34
好,問題更新。 – 2013-04-25 21:15:20