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