require.js、jQuery、jQueryMobile(jqm)、ノックアウト、サミーを含むテストアプリのセットアップがあります
require.jsはjqm、ノックアウト、サミーに読み込まれます
アプリのメインページで、sammyを使用してノックアウト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)
<div data-role="page" data-theme="c" class="ui-page" id="products">
<div data-role="header" data-position="fixed">
<h1>Products</h1>
<a href="#home" data-icon="home" data-iconpos="notext" data-direction="reverse">Home</a>
</div>
<div data-role="content">
<ul data-role="listview" data-inset="true" data-bind="foreach: products" >
<li>
<a data-bind="attr:{href:'#products/list/' + id}, text: name"></a>
</li>
</ul>
</div>
いくつかの問題があります
sammyはこの順序で読み込まれることになっています。これは、更新すると、読み込みが遅すぎるためにsammyまたはjqueryが定義されていないというエラーがスローされるためです。
製品ページでは、jQueryMobile changePageが呼び出されているため、ホームページからアクセスすると正常に読み込まれますが、ユーザーがそのページを更新すると、JSONから取得したリストのスタイルがすべて失われます。
これは、テンプレートからページをレンダリングしてからリストを作成する方法が原因だと思いますが、別の方法を考えることはできません。
だから私は考えていました(おそらく最善の解決策ではありません)が、更新時にpageChangeを強制する方法はありますか?または誰かがより良い解決策を持っていますか?
3.3。
これは外部テンプレートを呼び出すための最良の方法ですか/テンプレートを本文に追加するためのより良い方法がありますか?それを行うのにかかる時間は、スタイリングの問題を引き起こしていると思います。また、次のレベルの製品を追加すると、次のページに移動する前に、このページでそれらのレンダリングが開始されます。
私は、knockoutとrequirejsを使用して外部テンプレートをロードするための最良の方法を見つけるのに苦労しています。チームの他のメンバーがテンプレートを簡単に編集して構造を作成できるように、テンプレートをHTMLで保持したいと思います。
このデモはここで見ることができます
http://demo.stg.brightonconsulting.net.au/templates/tests/knockoutJQMProducts/
本当に助けてくれてありがとう