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