摘要:從技術的角度講,出于的原因,無法友好正式地生成位的,它只能生成偽隨機數。雖然中內置的方法盡管產生的是偽隨機數,但也足夠用了。
持久化記錄
需要一種保持記錄持久化的方法,即將引用保存至新創建的實例中以便任何時候都
能訪問它。通過在Model 中使用records 對象來實現。當保存一個實例的時候,
就將它添加進這個對象中;當刪除實例時,和將它從對象中刪除:
// 用來保存資源的對象 Model.records = {}; Model.include({ newRecord: true, create: function(){ this.newRecord = false; this.parent.records[this.id] = this; }, destroy: function(){ delete this.parent.records[this.id]; } });
更新一個已存在的實例——只需更新對象引用即可:
Model.include({ update: function(){ this.parent.records[this.id] = this; } });
現在創建一個快捷函數來保存實例,這樣就不用每次都檢查這個實例是否已經保存過或
是否需要新創建實例了:
// 將對象存入hash 記錄中,保持一個引用指向它 Model.include({ save: function(){ this.newRecord ? this.create() : this.update(); } });
用來根據ID 查找資源的find() 函數:
Model.extend({ // 通過ID 查找,找不到則拋出異常 find: function(id){ return this.records[id] || throw("Unknown record"); } });
現在已經成功地創建了一個基本的ORM,運行一下:
var asset = Asset.init(); asset.name = "same, same"; asset.id = 1 asset.save(); var asset2 = Asset.init(); asset2.name = "but different"; asset2.id = 2; asset2.save(); assertEqual( Asset.find(1).name, "same, same" ); asset2.destroy();增加 ID 支持
此時每次保存一條記錄都必須手動指定一個ID。可以加入自動化處理。首先,我們需要一個方法來自動生成ID,可以使用全局統一標識(Globally UniqueIdentifier,簡稱GUID)生成器來做這一步。從技術的角度講,出于API 的原因,JavaScript 無法友好正式地生成128 位的GUID,它只能生成偽隨機數。雖然JavaScript 中內置的Math.random() 方法盡管產生的是偽隨機數,但也足夠用了。
Robert Kieffer 寫了一個簡單明了的GUID 生成器,它使用Math.random() 來產生一個偽
隨機數的GUID(http://goo.gl/0b0hu),代碼也很簡單:
Math.guid = function(){ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == "x" ? r : (r&0x3|0x8); return v.toString(16); }).toUpperCase(); };
現在有了生成GUID 的方法,可以很容易將它集成到ORM 里,剩下的只需修改
create() 函數了:
Model.extend({ create: function(){ if ( !this.id ) this.id = Math.guid(); this.newRecord = false; this.parent.records[this.id] = this; } });
這樣任何新創建的記錄都包含一個隨機的GUID 作為它們的ID :
var asset = Asset.init(); asset.save(); asset.id //=> "54E52592-313E-4F8B-869B-58D61F00DC74"尋址引用
目前創建的ORM 中存在一個與引用相關的bug。當保存或
通過find() 查找記錄時,所返回的實例并沒有復制一份,因此對任何屬性的修改都會影
響原始資源。改進:
var asset = new Asset({name: "foo"}); asset.save(); // 正確傳入資源 assertEqual( Asset.find(asset.id).name, "foo" ); // 更改屬性,而沒有調用update() asset.name = "wem"; // 出問題了,因為asset 的名字被修改為“wem” assertEqual( Asset.find(asset.id).name, "foo" );
需要修復這個問題,在執行find() 操作的時候新創建一個對象,同樣在創建或更新
記錄的時候需要復制對象:
Asset.extend({ find: function(id){ var record = this.records[id]; if ( !record ) throw("Unknown record"); return record.dup(); } }); Asset.include({ create: function(){ this.newRecord = false; this.parent.records[this.id] = this.dup(); }, update: function(){ this.parent.records[this.id] = this.dup(); }, dup: function(){ return jQuery.extend(true, {}, this); } });
這里存在另外一個問題,Model.records 是被所有模型所共享的對象:
assertEqual( Asset.records, Person.records );
但這在合并所有的記錄時會有副作用:
var asset = Asset.init(); asset.save(); assert( asset in Person.records );
解決辦法是在創建新的模型時設置一個新的records 對象。Model.create() 是創建新對
象的回調,因此我們可以設置任意描述這個模型的對象:
Model.extend({ created: function(){ this.records = {}; } });
【公開記錄學習JS MVC,不知道能堅持多久= =。以《基于MVC的JavaScript web富應用開發》為主要學習資料。】
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85576.html
摘要:模型應當從視圖和控制器中解耦出來。與數據操作和行為相關的邏輯都應當放入模型中,通過命名空間進行管理。在應用中,對象關系映射也是一種非常有用的技術,它可以用來做數據管理及用做模型。以基于的富應用開發為主要學習資料。 MVC 和命名空間 要確保應用中的視圖、狀態和數據彼此清晰分離,才能讓架構更加整潔有序且更加健壯。模型應當從視圖和控制器中解耦出來。與數據操作和行為相關的邏輯都應當放入模型...
摘要:以基于的富應用開發為主要學習資料。下面用實現一個例子使用匿名函數來封裝一個作用域在頁面加載時綁定事件監聽上面的代碼創建了控制器,這個控制器是放在變量下的命名空間。然后用了一個匿名函數封裝了一個作用域,以避免對全局作用域造成污染。 公開記錄學習JS MVC,不知道能堅持多久= =。以《基于MVC的JavaScript web富應用開發》為主要學習資料。 什么是MVC MVC 是一種設...
摘要:今天同學去面試,做了兩道面試題全部做錯了,發過來給道典型的面試題前端掘金在界中,開發人員的需求量一直居高不下。 排序算法 -- JavaScript 標準參考教程(alpha) - 前端 - 掘金來自《JavaScript 標準參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實現 選擇排序 簡介 算法實現 ... 圖例詳解那道 setTimeout 與循環閉包的經典面...
摘要:是的架構的實現。是在年提出的一種前端架構,主要用來處理復雜的邏輯的一致性問題當時是為了解決頁面的消息通知問題。 去年10月底來到了新公司,剛開始接手 Android 項目時,發現該項目真的是一團遭,項目開發上沒有任何架構可言,開發人員連簡單的 MVC、MVP 都不了解,Activity 及其臃腫,業務邊界也不明確,因此我決定重新分析一下當前主流的幾種開發架構,選出適合當前項目的架構形式...
摘要:它通過數據模型進行鍵值綁定及事件處理,通過模型集合器提供一套豐富的用于枚舉功能,通過視圖來進行事件處理及與現有的通過接口進行交互。 本人兼職前端付費技術顧問,如需幫助請加本人微信hawx1993或QQ345823102,非誠勿擾 1.為初學前端而不知道怎么做項目的你指導 2.指導并扎實你的JavaScript基礎 3.幫你準備面試并提供相關指導性意見 4.為你的前端之路提供極具建設性的...
閱讀 2801·2023-04-25 18:06
閱讀 2586·2021-11-22 09:34
閱讀 1691·2021-11-08 13:16
閱讀 1314·2021-09-24 09:47
閱讀 3055·2019-08-30 15:44
閱讀 2779·2019-08-29 17:24
閱讀 2591·2019-08-23 18:37
閱讀 2441·2019-08-23 16:55