成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

animabear / 1824人閱讀

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

相關(guān)文章

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

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

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

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

    xorpay 評論0 收藏0
  • Deep in JS - 收藏集 - 掘金

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

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

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

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

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

    FrancisSoung 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<