javascript - knockout.js 中的双向焦点绑定(bind)

标签 javascript jquery knockout.js

我有这个自定义绑定(bind),它使用应用到的元素的聚焦子元素的数据更新可观察对象:

ko.bindingHandlers.selected =
  init: (element, valueAccessor) ->
    receiver = valueAccessor()
    $(element).focusin((event) ->
      data = ko.dataFor(event.target)
      receiver(data)
    )

这比标准的 hasFocus 绑定(bind)更适合我希望页面的其他部分显示有关焦点项目的信息的用例:

<ul data-bind="foreach: items, selected: selectedItem">
    <li><a href="#" data-bind="text: name"></a></li>
</ul>
<p data-bind="with: selectedItem">
    Selected: <span data-bind="text: name"></span>
</p>

现在我想使它成为双向绑定(bind),这样我就可以从我的脚本代码中更改 selectedItem,并使正确的列表元素成为 $.focus()< 的焦点。有什么想法可以扩展绑定(bind)以双向工作吗?

我意识到我可能需要使用“控制后代绑定(bind)”方法,并且无法将绑定(bind)应用于与 foreach 绑定(bind)相同的元素,但这没关系。我遇到的问题是调用更新函数时子元素似乎没有绑定(bind)(dataFor 返回未定义)。

最佳答案

您可以遍历 update 函数中的后代元素,并使用 ko.dataFor 检查要聚焦的元素:

update: (element, valueAccessor) ->
    receiver = valueAccessor()
    item = receiver()
    $(element).find("*").each((index, elem) ->      
      if (item == ko.dataFor(elem))
        $(elem).focus()
    )

演示 JSFiddle .

关于javascript - knockout.js 中的双向焦点绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21180762/

相关文章:

javascript - RequireJS:如何向路径添加前缀

javascript - Javascript 变量声明简写是使变量成为全局变量还是局部变量?

javascript - 在具有相同类的每个表上运行 jquery

javascript - 如何在点击事件中更新 ko.observable 文本?

javascript - 使用自定义绑定(bind)时如何更新 Knockout ViewModel

javascript - 单击时不更新函数的输出

javascript - 单击事件中与axios结合使用的剪贴板API

javascript - 如何使用 jQuery 创建滑动菜单(从右到左/从左到右)

javascript - 如何在使用 Primefaces 的 Gmap 中准备好 map 后运行 js 函数?

javascript - Jquery checkbox.checked 总是返回 false