<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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}}\

      1. \
        ${name}:\

        ${content}

        \
        刪除\
      2. \
        {{/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
        主站蜘蛛池模板: 免费A级毛片在线播放不收费| 在线视频精品免费| 亚洲av无码国产精品色在线看不卡 | 国产精品亚洲AV三区| AA免费观看的1000部电影| 久久久久亚洲AV片无码下载蜜桃| 最近中文字幕大全免费版在线 | 四虎在线视频免费观看视频| 亚洲综合无码一区二区三区| 午夜免费啪视频在线观看 | a级毛片视频免费观看| 亚洲成av人在线视| 亚洲精品免费视频| 亚洲国产精品综合久久2007| 久久99九九国产免费看小说| 亚洲中文字幕乱码一区| 四虎永久免费影院| 国产乱子伦精品免费视频| 亚洲动漫精品无码av天堂| 99久久99久久免费精品小说 | 亚洲国产成人五月综合网 | 中文字幕在线免费观看| 亚洲一级免费毛片| 欧洲精品免费一区二区三区| 免费看一级一级人妻片| 国产精品亚洲一区二区三区在线| 无码国产精品一区二区免费模式| 亚洲成AV人片久久| 日本一区免费电影| av永久免费网站在线观看 | 亚洲午夜久久久久久久久久| 97精品免费视频| 色偷偷亚洲第一综合| 亚洲va久久久噜噜噜久久天堂| 日本不卡高清中文字幕免费| 一区二区三区免费电影| 中文字幕亚洲色图| 免费观看日本污污ww网站一区| 91福利免费网站在线观看| 亚洲不卡在线观看| 日韩亚洲变态另类中文|