Javascript 使用TurboLink正确绑定多个淘汰视图模型?

Javascript 使用TurboLink正确绑定多个淘汰视图模型?,javascript,knockout.js,turbolinks,Javascript,Knockout.js,Turbolinks,目前,我正在开发的网站为我们的前端框架使用了knockout。我想将TurboLink与跨不同页面的多个淘汰视图模型结合起来。我遇到的问题是,由于turbolinks实际上不会更改页面,绑定会被应用多次,从而导致错误 到目前为止,我已经尝试过了 我发现它准确地描述了我想做的事情,但不一定有效 他的解决方案是将ko.applyBindings替换为 window.applyTurboBindings = function(node, viewModelAccessor) { return $(

目前,我正在开发的网站为我们的前端框架使用了knockout。我想将TurboLink与跨不同页面的多个淘汰视图模型结合起来。我遇到的问题是,由于turbolinks实际上不会更改页面,绑定会被应用多次,从而导致错误

到目前为止,我已经尝试过了

我发现它准确地描述了我想做的事情,但不一定有效

他的解决方案是将
ko.applyBindings
替换为

window.applyTurboBindings = function(node, viewModelAccessor) {
  return $(document).one("page:change", function() {
    return ko.applyBindings(viewModelAccessor(), node);
  });
};
和这个一起使用

applyTurboBindings(document.getElementById('my-node'), function() {
  return new MyViewModel();
});
page:change
不再是TurboLink文档中使用的方法。因此,我尝试使用
turbolinks:load
(在初始页面加载后触发一次,每次访问turbolinks后再次触发)和
turbolinks:visit
(在访问开始后立即触发)。那也不行。调用方法
applyTurboBindings
时,不会触发该事件,因此不会应用任何绑定

这是我正在做的一个基本设置

当我通过调试器运行此命令时,
applyTurboBindings
永远不会捕获正在触发的事件(
turbolinks:load

我的一个想法是使用这样的东西:

$(document).one("turbolinks:load", function () {
  // execute all js for page here
});
而不是典型的

$(function(){
  // execute all js for page here
});
但是我也不能让它工作,因为绑定仍然被应用了很多次

所以我的问题是,我到底是如何让它在多个viewmodels中工作的,这样绑定就不会中断?我应该以不同的方式组织我的js吗?是否有一个简单的解决方案我没有看到,或者这只是一个不好的主意,同时使用两者


顺便说一下,这是我关于堆栈溢出的第一个问题,如果我遗漏了什么或者我的问题不够清楚,请告诉我。感谢您的帮助。

对于您的小提琴来说,它没有被击中的原因是javascript已经被JSFIDLE放在document.ready()函数中,因此turbolinks:load函数在javascript执行之前就已经被击中了。如果将JSFIDLE选项的JS部分中的gear更改为LoadType:nowrap,则会触发。@JasonSpake,它是为小提琴而做的。那么,我应该在我的文档头部调用applyTurboBindings函数吗?不一定。这取决于加载TurboLink库的位置。您希望首先设置事件处理程序,然后加载库,因为库一加载就会自动启动。(除非装有AMD)。@JasonSpake这是有道理的。我将尝试用AMD加载它。非常感谢。用你的小提琴,它没有被击中的原因是javascript已经被JSFIDLE放在document.ready()函数中,所以turbolinks:load函数在javascript执行之前就已经被击中了。如果将JSFIDLE选项的JS部分中的gear更改为LoadType:nowrap,则会触发。@JasonSpake,它是为小提琴而做的。那么,我应该在我的文档头部调用applyTurboBindings函数吗?不一定。这取决于加载TurboLink库的位置。您希望首先设置事件处理程序,然后加载库,因为库一加载就会自动启动。(除非装有AMD)。@JasonSpake这是有道理的。我将尝试用AMD加载它。非常感谢。