Knockout JS与Ratchet和push.js配合得很好,直到我添加了一个数据转换
Knockout JS plays nicely with Ratchet and push.js until I add a data-transition
我正在使用Ratchet.js/push.js库来创建移动web应用程序的UI。在这个库中,链接是通过"push "要加载的文件到"push "来处理的。content"DOM元素,而不是加载整个页面。但是,push.js不加载加载页面时发现的任何脚本-这禁用了Knockout.js代码。
我在StackOverflow上找到了一个解决方案,它工作得很好-只需为推送事件添加一个事件侦听器。我修改了它,使它可以加载任何脚本跨多个页面,所以它与外部脚本文件:
window.addEventListener('push', function () {
var scriptsList = document.querySelectorAll('script.js-custom'); // Add a "js-custom" class to your script tag
for (var i = 0; i < scriptsList.length; ++i) {
// Handle scripts in separate files by assigning the script file name to its id.
// We save it in a variable because the ".done" callback is asynchronous.
scriptName = scriptsList[i].id; // IMPORTANT: Only one loadable script per page!
$.getScript("/path info here/" + scriptName)
.done(function (script, textStatus) {
eval(script);
})
... error handling ...
}
});
在目标HTML页面中,脚本被赋予class和id标签,因此它们可以使用上面的内容:
<script src="Challenge.js" class="js-custom" id="challenge.js"></script>
还要注意,Knockout绑定必须发生在特定的命名DOM元素上,这样才不会混淆Knockout:
ko.cleanNode($("#ChallengePage")[0]);
ko.applyBindings(challengeFn, $("#ChallengePage")[0]);
我们使用cleanNode来避免"已绑定"错误。
OK !所以所有这些都很好,我希望那些正在努力解决这个问题的人会发现它很有用。
然而,当给链接一个过渡时:
<a href="challenge.html" data-transition="slide-in">....
然后它以"Cannot read property 'nodeType' of undefined "中断。我曾认为这可能只是等待转换完成的问题,但即使我用:
替换脚本的evalscriptContents = script;
setTimeout(function () { eval(scriptContents); }, 1000);
没用的
任何建议或帮助将不胜感激!我真的不需要"推送"页面,如果我不使用过渡,所以我希望有人会有最后的关键,使这一切工作!更新:发生错误是因为"文档。使用转换时使用当前文档而不是被推送的文档时调用querySelectorAll"。此外,使用"webkitTransitionEnd"作为我的事件也可以工作,但这并不能解决文档问题。因此,我可以做到这一点,但只适用于单个过渡—现在我没有办法获得正在加载的文档。理想情况下,无论链接是否使用过渡,都可以工作的解决方案是我正在寻找的。
Ratchet和Knockout的组合在未来几个月可能会很流行,所以我希望其他人也能找到这个解决方案。
要组合Ratchet.js和Knockout.js库,只需要处理Ratchet.js(通过Push.js)将尝试管理页面转换的事实。在转换期间,目标页面上的JavaScript(包括Knockout)将不会运行,除非您特别这样做。这就是这个解决方案所做的:它使得加载和运行你的Knockout JavaScript代码成为可能,即使Ratchet正在管理页面转换。
在我的解决方案中,我们总是将JavaScript放在一个单独的文件中,并实现禁止任何JS代码在页面上运行的内容安全策略。这是一种良好的安全卫生,有助于减少XSS攻击的攻击面。因此,下面的解决方案1)假设JS位于单独的文件中,2)假设HTML和JS文件具有完全相同的名称和路径-除了扩展名(有点像将. JS文件视为ASP。. NET代码(用于HTML文件)。
在你的"根"页面——开始你与移动web应用中其他页面的所有交互的页面,放置以下函数。当Ratchet加载相应的。html文件时,它将加载相应的。js文件:
window.addEventListener('push', function (params) {
var targetPage = params.target.document.baseURI.replace(".html", ".js");
$.getScript(targetPage)
.done(function (script, textStatus) {
eval(script);
})
.fail(function (jqxhr, settings, exception) {
alert("Error loading script: " + exception);
});
});
注意,您必须将Knockout绑定应用于HTML页面中的一个命名且唯一的div(通常是位于Ratchet .contentdiv下面的div)。这只是因为每个页面加载都必须将其Knockout绑定应用于正在加载的HTML。
ko.cleanNode($("#DivPageName")[0]);
ko.applyBindings(KnockoutFn, $("#DivPageName")[0]);
更新:我发现这个解决方案有时会"困惑",因为页面被推送和弹出历史堆栈。我决定不使用它,尽管它似乎有97%。如果有人有任何改进,使这完全可靠,我洗耳恭听!
- 如何在javascript转换编码中将一个动态值从一个表单添加到另一个页面
- IE10+11:XSLT转换将任意CR/LF添加到XML中
- 将Google AdWords转换跟踪(javascript)代码添加到PrestaShop/Smarty页面中
- 通过JS添加类时应用CSS转换
- 如何添加html<br>标记转换为javascript
- 在转换后的 UL 列表中添加选择选项
- 由 JavaScript 控制的 CSS3 单向转换在按顺序添加/删除类时不起作用
- 将复选框转换为图像,需要添加拖动功能才能更改图像
- 如何使用jquery添加一个简单的转换
- Ember添加了对转换调用上下文(路由/控制器)的检查
- 我的JS在将ascii转换为字符串时添加了一个空格
- 添加CSS3转换浮动导航栏-JQUERY
- 如何将转换添加到JavaScript切换类
- 转换是在添加特定于转换的css属性之前所做的更改的触发.为什么?
- 添加CSS3转换展开/折叠
- 将文件转换为数组并使用数据列表和选项标签为自动完成文本框添加数组元素
- 添加css转换时间以使用javascript切换类
- 如何添加名称并将数组值转换为 JSON
- 在表中添加时,转换在切换类中不起作用
- 使用jQuery将新的css应用于元素,如何添加转换