成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JavaScript MVC 學(xué)習(xí)筆記(七)模型之ORM

animabear / 1873人閱讀

摘要:從技術(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

相關(guān)文章

  • JavaScript MVC 學(xué)習(xí)筆記(六)模型ORM

    摘要:模型應(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)放入模型...

    mrcode 評(píng)論0 收藏0
  • JavaScript MVC 學(xué)習(xí)筆記(一)初識(shí)JS MVC

    摘要:以基于的富應(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è)...

    xorpay 評(píng)論0 收藏0
  • Deep in JS - 收藏集 - 掘金

    摘要:今天同學(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)典面...

    enali 評(píng)論0 收藏0
  • 我的Android重構(gòu)旅:架構(gòu)篇

    摘要:是的架構(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)形式...

    mylxsw 評(píng)論0 收藏0
  • Backbone.js學(xué)習(xí)筆記(一)

    摘要:它通過(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è)性的...

    FrancisSoung 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<