事先一些注意事項:
我使用RequireJS分我的應用程序成模塊 - 這是不是必需的(沒有雙關語意) - 你可以先把東西都堆在一個JavaScript文件就了事,我覺得組織起來更容易。 This question顯示了我的項目佈局。
我也沒有使用SammyJS進行路由,但是使用了Crossroads和Hasher。這些概念應該有點相同。
下面的例子可能不是你所做的100%匹配,但希望它給你一個我正在使用的方法的想法。
我的main.js
包含所有的路由信息,並且在每個路由處理程序中,我使用RequireJS中的require()
來拉入我用於該路由的模塊。每個模塊包含了淘汰賽視圖模型和幾種方法來做事像視圖模型加載數據,在某些情況下將其綁定等
main.js
這裏是我如何處理路線顯示#/person/id
路線:
crossroads.addRoute("person/{id}", function(id){
require(["person"], function(person) {
var model = person.load(id);
person.view($('#content'), model);
});
});
的person.js
重要的部分:
define(['jquery', 'knockout', ...], function($, ko, ...) {
var person = {};
person.Model = function Model(id) {
this.id = ko.observable(id);
this.name = ko.observable();
// more properties and methods removed...
};
person.load = function(id) {
var model = new person.Model(id);
var request = $.ajax({
// ajax config properties removed...
'success' : function(resp) {
model.name (resp.name);
// more property setting removed...
}
});
return model;
};
person.view = function(element, model) {
// Using require text plugin to load templates...
require(['text!templates/person/view.tmpl.html'], function(ViewTemplate) {
element.empty();
element.html(ViewTemplate).ready(function() {
ko.applyBindings(model, element.get(0));
// any further setup needed below...
});
});
};
return person;
});
你也可以看看[擊退(http://kmalakoff.github.com/knockback/);一個採用Knockout和Backbone的「兩全其美」的框架(包括路由和歷史支持)。 – MarcoK 2013-02-22 10:46:42