Durandal.js / Knockout.js - 在compositionComplete之后是否可以返回原始点击事件?

时间:2014-02-11 21:29:18

标签: javascript knockout.js durandal promise

所以我正在开发一个durandal / knockout应用程序,我点击一个如此定义的按钮:

<button class="addNote" data-bind="click: function () { addNote($parent); }">
    <i class="fa fa-plus"></i>
</button>

我的“addNote”处理程序关闭并组成一个新的视图/模型(基本上只是一个大的绑定文本区域)并将它们插入到屏幕中。在该合成的最后(在compositionComplete方法中)我使用knockout的hasFocus绑定将焦点设置在新创建的textarea上。

var compositionComplete = function (view, parent) {
    setFocus(true);
};

<textarea data-bind="value: note, hasFocus: setFocus" autofocus></textarea>

这非常好用,因为我的用户可以按“添加”按钮,然后开始键入一个音符,而不必将光标放入&lt; textarea&gt;领域。在移动设备上除外(我已经尝试过iPad,iPhone,Nexus平板电脑,表面,三星s3 / s4,Windows手机)。

焦点实际上是在&lt; textarea&gt;上设置的。 (我可以说因为我们应用了专注的风格),但用户仍然需要点击/点击&lt; textarea&gt;让软键盘打开。经过大量的谷歌搜索和几次尝试失败后,我发现有些人在关注&lt; textarea&gt;时会注意到成功。来自原始点击事件。

对于durandal / knockout和一个普通的js编码器来说还是比较新的,我想知道是否有办法让compositionComplete运行(以便我知道&lt; textarea&gt;已加载)到我的点击事件中然后可以设定焦点?就像一连串的承诺或某种事件链?我的理论是,如果我可以在click事件中等待设置焦点,键盘可能会弹出。

<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);
};

2 个答案:

答案 0 :(得分:0)

虽然它只是出现在移动设备上,但它可能只是一个时间问题。

因此,我开始使用Durandal的composition.addBindingHandler('hasFocus'); http://durandaljs.com/documentation/Interacting-with-the-DOM.html功能来确保在视图合成后hasfocus触发。

计划b)利用Durandal的事件系统http://durandaljs.com/documentation/Leveraging-Publish-Subscribe.html。在这种情况下,您可能想要提供一个dfiddle https://github.com/dFiddle/dFiddle-2.0,其中包含一个演示该问题的最小实现。这样可以更容易地发现触发事件的最佳位置。

答案 1 :(得分:0)

阻力最小的路径可能只是在textarea上触发click事件。