我正在爲移動用戶(最終將移植到Phonegap)定位的單頁網站上工作。我已將我的屏幕細分爲「卡片」,基本上我只是根據需要顯示/初始化/隱藏了<div>
。鏈接單個頁面的Web應用程序的部分
目前我無法確定正確的結構,以便將這些面板連接成一個連貫的應用程序。我目前的執行是這樣的(目前使用的淘汰賽,因爲我熟悉它):
//Javascript
var LoginCard = function() {
this.goToRegister = function() {
// IF registerCard is not initialized
// THEN ko.applyBindings(new RegisterCard(), document.getElementById('registerCard'));
// ELSE $('#registerCard').show();
};
this.doLogin = function() { /* Goes to home card after login */ };
}
var RegisterCard = function() {
this.goToLogin = function() { /* Goes back to login card */ };
this.doRegister = function() { /* Goes to login card after reg */ };
}
ko.applyBindings(new LoginCard(), document.getElementById('loginCard'));
//HTML
<div id="loginCard">
<button data-bind="click: goToRegister" id="btnReg">Register Account</button>
<button data-bind="click: doLogin" id="btnLogin">Login</button>
</div>
<div id="registerCard">
<button data-bind="click: goToLogin" id="btnBackToLogin">Back To Login</button>
<button data-bind="click: doRegister" id="btnDoReg">Submit Registration</button>
</div>
正如你可以看到,連接視圖模型本身內發生,所以不同的視圖模型(例如loginCard,registerCard ,homeCard)變得緊密相連。
更加「低級」的替代方案也只是使用jQuery綁定按鈕事件,使每個卡沒有了解對方的卡細節:
//But this means I have to specify a ton of unique IDs for all the elements in the page.
$('#btnReg').click(function() { /* Initialize and go to registerCard. */ });
我也想過用的散列路由/ pushState所以雖然點擊事件仍然在每個視圖模型中,但它只需要知道哪些URL即可到達?例如:
var LoginCard = function() {
this.goToRegister = function() {
window.location.hash = 'register';
//or history.pushState('state', '', 'register';
};
}
這是我第一次嘗試創建單頁應用程序,所以我對設計選擇非常困惑。哪一個會更好,或者任何人都可以提出關於此的標準方法?
謝謝,我從看你的項目結構中得到一些想法。在製作應用程序時,您是否仍會鏈接到用作參考的任何資源/網站? –
複合視圖中的SPA課程(http://www.pluralsight.com/training/Courses/TableOfContents/spa)是一個很好的參考,儘管一些功能取決於asp.net mvc框架。而BoilerplateJS(https://github.com/ectechno/boilerplatejs)也可能是一個很好的詮釋。它爲SPA提供了一些幫助功能,並展示了SPA風格應用的最佳實踐 – Ray