国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

JavaScript中的View-Model使用介紹_javascript技巧

來源:懂視網 責編:小采 時間:2020-11-27 21:00:08
文檔

JavaScript中的View-Model使用介紹_javascript技巧

JavaScript中的View-Model使用介紹_javascript技巧:構成 這是一個十分常見的微博列表頁面,類似于新浪微博。上周末,在心無旁騖情況下,一共用了5個對象,產出400行代碼,實踐出一種代碼組織模式。 使任務輕松完成的代碼有4個方面的要素組成: 要素 組成 模型 Reply、Forward 視圖 CommentE
推薦度:
導讀JavaScript中的View-Model使用介紹_javascript技巧:構成 這是一個十分常見的微博列表頁面,類似于新浪微博。上周末,在心無旁騖情況下,一共用了5個對象,產出400行代碼,實踐出一種代碼組織模式。 使任務輕松完成的代碼有4個方面的要素組成: 要素 組成 模型 Reply、Forward 視圖 CommentE

構成
這是一個十分常見的微博列表頁面,類似于新浪微博。上周末,在心無旁騖情況下,一共用了5個對象,產出400行代碼,實踐出一種代碼組織模式。

使任務輕松完成的代碼有4個方面的要素組成:

要素 組成
模型 Reply、Forward
視圖 CommentEditor、ReplyList、ForwardList
模板 jQuery.tmpl
異步任務 jQuery.Deferred
分部介紹
模型
模型只與數據有關,它能夠產生、過濾、保存、驗證數據,并且僅此而已。

如下例,留言模型在調用保存方法時,只接收JSON參數,并且只返回一個異步任務,實際處理時同步或異步的返回結果并不重要。
在此進行的驗證的原因是,它是一個開放的對象,是與服務器交互的最后一道門檻。
另外,它本身也不處理驗證失敗的情況——由視圖調用時選擇性地處理,可能會彈出一個消息提示或直接忽略再進行重試。
代碼如下:
// 留言模型
var Reply = {
cache : {},
// { sourceid : id,page_size : 10,page_num : 1 }
fetch : function(data) {
return $.post('/ajax/blog/reply/list',data||{}).success(function(resp) {
resp.ok && resp.list &&
$.each(resp.list,function(k,v) {
return Reply.cache[v.id] = v;
});
});
},
// filter('name','king')
filter : function(prop,val) {
return $.grep(this.cache,function(r){ return r[prop] === val });
},
// { content : '想說就說',sourceid : 1001 }
create : function(data) {
// promise
var dfd = $.Deferred(), now = $.now();
if( (now - this.create.timestamp)/1000 < 10 ){
dfd.reject({message:'您發表得太快了,休息一下吧',type:'warn'})
}else if(!data || !data.sourceid){
dfd.reject({message:'非法操作',type:'error'})
}else if(!data.content){
dfd.reject({message:'評論內容不能為空',type:'warn'})
}else{
this.create.timestamp = now;
dfd = $.post('/ajax/blog/reply/create',data);
}
return dfd.promise();
}
};
Reply.create.timestamp = Forward.create.timestamp = $.now() - 1e4;

視圖
視圖是瀏覽器頁面上的可視部分,每個視圖對象含有一個關聯的 jQuery 對象作為屬性(instance.$el),類似于UI組件中的DOM容器。

視圖還有兩個一致的方法:

render 方法用于從模型獲取數據,并且根據定義好的模板將數據渲染到HTML頁面上。
activate 方法用于激活視圖,同時綁定相關的DOM事件,所有事件至多委托到$el為止。
這個示例中,CommentEditor是父視圖,ReplyList和ForwardList是互斥顯示的兩個子視圖,父子視圖之間相互保存引用。
代碼如下:
// 回復列表視圖
var ReplyList = function(options) {
var opt = this.opt = $.extend({
el : '',
parent : null
},options||{});

this.parent = opt.parent;
this.$el = $(opt.el);
this.activate();
};
ReplyList.prototype = {
render : function() {
var self = this;
Reply.fetch({
page_size : 10, page_num : 1,
sourceid : self.parent.getBlogId()
})
.done(function(data) {
self.$el.html( self.$list = $.tmpl(tpl_reply_list,data) );
});
return self;
},
activate : function() {
this.$el.delegate('a.del',$.proxy(this.del,this))
}
// ...
}

// 評論編輯器視圖
CommentEditor.prototype = {
activate : function() {
this.$el.delegate('a.save',$.proxy(this.save,this))
},
save : function() {
var self = this, data = { content : self.getContent(),sourceid : self.getBlogId() };
var task_r = Reply.create(data);
var task_f = Forward.create(data);
// 轉發、評論同時進行
$.when(task_r,task_f).then(function(t1,t2) {
// 保存成功,更新視圖或關閉
},function(data) {
// 模型驗證出錯,或遠程服務器錯誤
Sys.info(data.message,data.type);
});
return self;
},
switchView : function(type) {
// 切換子視圖
var view_opt = {el:this.$sublist.empty(),parent:this};
if(type === 'reply'){
$label.show();
this.$submit.val('評論');
this.sublist = new ReplyList(view_opt).render();
}else{
$label.hide();
this.$submit.val('轉發');
this.sublist = new ForwardList(view_opt).render();
}
}
// ...
}

模板
模板可以消除繁瑣、丑陋的字符串拼接,它的作用是能夠直接由js對象生成HTML片斷。

模板中可以直接遍歷對象,套用預定義的函數,來對一些數據進行格式化,比如時間函數nicetime:
代碼如下:
// 回復列表模板
var tpl_reply_list = '\
{{each list}}\

  • \
    ${name}:\

    ${content}

    \
    刪除\
  • \
    {{/each}}\
    ';

    異步任務
    Deferred Object 的直譯是延遲對象,但是理解成異步任務更為恰當。異步任務能夠消除多層嵌套的回調,讓代碼書寫和閱讀更為便利。

    從上面的模型和視圖的代碼中可以明顯地看出,使用了異步任務之后,代碼變得更加平面化了。

    $.Deferred 方法新建的是一個雙向任務隊列:成功回調函數隊列和失敗回調函數隊列;任務的狀態也分為兩種:成功和失敗,分別可以用isResolved或isRejected來檢查任務的當前狀態、用resolve或reject修改任務狀態。

    promise 方法返回任務的只讀副本,此副本上不能修改任務狀態。毫無疑問,模型應該始終只返回 promise 對象。(注:只讀副本仍然可以再次調用 promise 方法再次返回只讀副本)

    在Reply.create方法中,能夠更好地處理自定義的異步任務,而不是直接返回原生的ajax異步任務:
    代碼如下:
    // var dfd = $.Deferred();
    $.post('/ajax/blog/reply/create',data)
    .success(function(json) {
    if(json && json.ok){
    dfd.resolve(json.list);
    }else{
    dfd.reject({message:json.message||'獲取失敗',type:'error'});
    }
    })
    .fail(function() {
    dfd.reject({message:'服務暫時不可用',type:'error'})
    });

    目的及結論
    為什么拆散成這樣?

    收獲:可維護性,清晰的API調用、消除二層以上的if語句、消除二層以上的回調語句、每個函數控制在二十行之內。

    結果:沒有過多的重復代碼,所有的功能都被打包好了。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    JavaScript中的View-Model使用介紹_javascript技巧

    JavaScript中的View-Model使用介紹_javascript技巧:構成 這是一個十分常見的微博列表頁面,類似于新浪微博。上周末,在心無旁騖情況下,一共用了5個對象,產出400行代碼,實踐出一種代碼組織模式。 使任務輕松完成的代碼有4個方面的要素組成: 要素 組成 模型 Reply、Forward 視圖 CommentE
    推薦度:
    標簽: javascript model view
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 亚洲美女一区二区三区 | 91社区在线观看精品 | 中文字幕另类 | 国产性做久久久久久 | 天天躁日日躁狠狠躁中文字幕老牛 | 国产成人久久精品区一区二区 | 九九国产精品九九 | xxx欧美888| 欧美日韩色图 | 一级毛片视频播放 | 日本不卡视频在线观看 | 99久久精品国产一区二区小说 | 国产一区二区在线看 | 福利视频一区二区三区 | 亚欧在线观看 | 日韩亚洲欧美综合 | 亚洲 欧洲 另类 综合 自拍 | 欧美在线精品一区二区三区 | 高清国产精品久久 | 国产日韩欧美精品 | 亚洲国产欧美日韩 | 国产a久久精品一区二区三区 | 国产精品va在线观看无 | 在线国产一区二区 | 视频国产精品 | 国产成人调教视频在线观看 | 欧美在线观看成人高清视频 | 国产网站免费观看 | 日韩欧美理论 | 精品国产一区二区三区在线 | 国产精选一区二区 | 久久亚洲伊人成综合人影院 | 国产一区二区不卡 | 999国产精品999久久久久久 | 国产区在线视频 | 一级黄网站 | 欧美日韩国产在线人 | 日韩亚洲欧美日本精品va | 日韩国产欧美一区二区三区 | 亚洲国产成人精品一区二区三区 | 91精品欧美一区二区三区 |