, viewmodel . , ko.applyBindings. -:
define(['app/shared/root-bindings', 'framework/page-disposer', 'ko', 'sugar'], function (
RootBindings, PageDisposer, ko) {
var initialRun = true;
var Page = {
init: function (name, data, controller, path) {
Page.loading(false);
name = name.toLowerCase();
if ((Page.page().name == name) && (Page.page().data == data)) {
if (controller) {
controller(data);
}
document.title = Page.title();
if (Page.initExtra) {
Page.initExtra(name, data, controller);
}
return data;
}
var autoDispose = (Page.page().data.dispose && Page.page().data.dispose(Page)) || true;
if (autoDispose !== false) {
PageDisposer.dispose(Page.page().data);
}
PageDisposer.init(data);
var initialized = (data.init && data.init(Page)) || true;
if (initialized === false) {
return false;
}
if (controller) {
controller(data);
}
Page.pageClass([name, ('ontouchstart' in document.documentElement) ? 'touch' : 'no-touch'].join(' '));
Page.page({
name: name,
data: data,
path: path
});
document.title = Page.title();
if (Page.initExtra) {
Page.initExtra(name, data, controller);
}
if (initialRun) {
ko.applyBindings(Page, document.getElementsByTagName('html')[0]);
initialRun = false;
}
return data;
},
page: ko.observable({
name: '',
data: {
init: function () {},
dispose: function () {}
}
}),
pageClass: ko.observable(''),
loading: ko.observable(false),
title: function () {
return Page.page().name.titleize();
}
};
Object.merge(Page, RootBindings);
return Page;
});
, SPA, , , , jQuery, Sugar.
https://github.com/onlyurei/knockout-spa
Live Demo: https://knockout-spa.mybluemix.net