所以我正在开发一个durandal/knocket应用程序,在那里我点击一个定义如下的按钮:
<button class="addNote" data-bind="click: function () { addNote($parent); }">
<i class="fa fa-plus"></i>
</button>
我的"addNote"处理程序启动并组成一个新的视图/模型(基本上只是一个大的绑定文本区域),并将它们插入到屏幕中。在合成结束时(在compositionComplete方法中),我使用knocket的hasFocus绑定将焦点设置在新创建的文本区域上。
var compositionComplete = function (view, parent) {
setFocus(true);
};
<textarea data-bind="value: note, hasFocus: setFocus" autofocus></textarea>
这工作得很好,因为我的用户可以按下"添加"按钮,并开始键入注释,而不必将光标放在<text区域>领域除了移动设备(我试过iPad、iPhone、Nexus平板电脑、surfaces、三星s3/s4、windows手机)。
焦点实际上设置在<text区域>(我可以判断,因为我们已经应用了聚焦风格),但用户仍然需要点击/点击<text区域>以打开软键盘。经过大量的谷歌搜索和几次失败的尝试,我发现有些人在将重点放在<text区域>来自原始点击事件。
作为durandal/knocket的新手,我充其量只是一个普通的js程序员,我想知道是否有一种方法可以让compositionComplete运行到我的点击事件(这样我就知道<textarea>已经加载),然后设置焦点?就像一连串的承诺还是一连串的事件?我的理论是,如果我能在点击事件时等待设置焦点,键盘可能会弹出。
<button class="addNote" data-bind="click: function () { someEvent($parent); }">
<i class="fa fa-plus"></i>
</button>
var someEvent = function (parent) {
addNote(parent);
//wait here until compositionComplete fires and then setFocus(true);
};
虽然只是出现在移动设备上,但可能只是时间问题。
所以我开始使用Durandal的composition.addBindingHandler('hasFocus');
http://durandaljs.com/documentation/Interacting-with-the-DOM.html确保hasfocus
在视图合成后激发的能力。
计划b)利用Durandal的活动系统http://durandaljs.com/documentation/Leveraging-Publish-Subscribe.html.在这种情况下,你可能想提出一个投标书https://github.com/dFiddle/dFiddle-2.0用一个最小的实现来证明这个问题。这样可能更容易发现触发事件的最佳地点。
阻力最小的路径可能只是在文本区域触发click
事件。