使用带有JQuery,jQuery Mobile,Knockout和Sammy的requirejs来构建带有外部模板的结构化应用程序时的性能/模板问题
我有一个测试应用程序的设置,其中包括require.js,jQuery,jQueryMobile(jqm),knockout和sammy
require.js加载jqm,knockout和sammy
在应用程序主页面上,我使用sammy加载了knockout viewModels。 这些viewModels模板中的加载..
所以要显示代码……
需要页面:
require.config({ jquery: 'vendor/jqm/jquery_1.7_min', jqm: 'vendor/jqm/jquery.mobile-1.1.0', knockout: 'vendor/knockout/knockout-2.2.0', sammy : 'vendor/sammy/sammy', text: 'vendor/require/text', views: '../views', templates: '../templates' } }); define(['app','jqm-config'], function(app) { $(document).ready(function() { console.log("DOM IS READY"); }); });
app.js
define(['jquery','knockout', 'sammy','views/home/home', 'views/products/products', 'jqm'], function($, ko, sammy, appViewModel, productsViewModel) { var self = this; self.goHome = function() { ko.applyBindings(new appViewModel()); }; self.goProducts = function() { ko.applyBindings(new productsViewModel()); }; Sammy(function() { this.get('#home', function() { self.goHome(); }); this.get('#products', function() { self.goProducts(); }); this.get('', function() { self.goHome(); }); }).run(); });
产品页面
define(['jquery', 'knockout','text!templates/test2.html', 'jqm'], function($, ko, productsViewTemplate){ function ProductType(id, name) { var self = this; self.id = id; self.name = name; } return function productsViewModel() { $('body').append(productsViewTemplate); var self = this; self.products = ko.observableArray(); var jqxhr = $.getJSON("data/product.json") .success(function(data, status, xhr) { self.products.removeAll(); $.each(data.data.productTypeList, function(i,item){ self.products.push(new ProductType(i, item.longName)); }) }) .error(function() { alert("error"); }) .complete(function() { $.mobile.changePage( '#products', { transition: "pop"}); }); } });
产品html(text2.html)
Products
Home
有几个问题
-
是sammy应该按顺序加载,因为每当我刷新它时会抛出一个错误,即sammy或jquery未定义,因为加载速度太慢我在猜测
-
在产品页面上,如果有人从主页上加载它,因为jQueryMobile changePage已被调用,但是如果用户然后刷新该页面,那么来自JSON的列表将丢失其所有样式。
我认为这是由于我从模板中呈现页面的方式,然后必须制作列表,但我不能想到另一种方法。
所以我在想(可能不是最好的解决方案),但有没有办法强制刷新一个pageChange? 还是有人有更好的解决方案?
3。
这是调用外部模板的最佳方式/是否有更好的方法将模板附加到正文中。 我真的认为这样做的时间是造成样式问题的原因,当我添加下一级别的产品时,它开始在此页面上呈现它们,然后再转移到下一个…
我正在努力寻找使用knockout和requirejs加载外部模板的最佳方法。 我希望将模板保留在HTML中,以便团队中的其他人可以轻松地编辑它并提供结构。
这个演示可以在这里看到
http://demo.stg.brightonconsulting.net.au/templates/tests/knockoutJQMProducts/
真的很感激任何帮助
看看你的演示,我可以提出一些建议。
- 在
main.js
删除对jqm-config
的依赖并将其添加到jqm-config
这样,在运行app.js
中的任何内容之前,您始终可以保证设置jquery移动配置。
- 确保您的
ko.applyBindings()
调用包装在.ready()
构造中。
- 每次切换页面时,都会将敲除重新绑定到同一节点。 这不是最佳做法,可能会导致一些奇怪的行为。 如果您要这样做,请确保首先取消应用绑定。 看看这里怎么样。
即使修复了所有这些项目,我也不确定你的事情会如何运作。 您可能最好先预先加载所有HTML并将所有页面绑定到具有子视图模型的一个父视图模型。