亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

Javascript MVC框架Backbone.js詳解

2024-05-06 16:08:55
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Javascript MVC框架Backbone.js詳解,本文對Backbone.js的各個模塊和方法的使用上都給出了實際例子,需要的朋友可以參考下
 
 

隨著JavaScript程序變得越來越復雜,往往需要一個團隊協作開發,這時代碼的模塊化和組織規范就變得異常重要了。MVC模式就是代碼組織的經典模式。

(……MVC介紹。)

(1)Model

Model表示數據層,也就是程序需要的數據源,通常使用JSON格式表示。

(2)View

View表示表現層,也就是用戶界面,對于網頁來說,就是用戶看到的網頁HTML代碼。

(3)Controller

Controller表示控制層,用來對原始數據(Model)進行加工,傳送到View。

由于網頁編程不同于客戶端編程,在MVC的基礎上,JavaScript社區產生了各種變體框架MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)等等,有人就把所有這一類框架的各種模式統稱為MV*。

框架的優點在于合理組織代碼、便于團隊合作和未來的維護,缺點在于有一定的學習成本,且限制你只能采取它的寫法。

Backbone的加載

 

復制代碼代碼如下:

<script src="/javascripts/lib/jquery.js"></script>
<script src="/javascripts/lib/underscore.js"></script>
<script src="/javascripts/lib/backbone.js"></script>
<script src="/javascripts/jst.js"></script>
<script src="/javascripts/router.js"></script>
<script src="/javascripts/init.js"></script>

 

Backbone.View

基本用法

Backbone.View方法用于定義視圖類。

復制代碼代碼如下:

var AppView = Backbone.View.extend({
  render: function(){
    $('main').append('<h1>一級標題</h1>');
  }
});

 

上面代碼通過Backbone.View的extend方法,定義了一個視圖類AppView。該類內部有一個render方法,用于將視圖放置在網頁上。

使用的時候,需要先新建視圖類的實例,然后通過實例,調用render方法,從而讓視圖在網頁上顯示。

復制代碼代碼如下:

var appView = new AppView();
appView.render();

上面代碼新建視圖類AppView的實例appView,然后調用appView.render,網頁上就會顯示指定的內容。

 

新建視圖實例時,通常需要指定Model。

復制代碼代碼如下:

var document = new Document({
  model: doc
});

 

initialize方法

視圖還可以定義initialize方法,生成實例的時候,會自動調用該方法對實例初始化。

 

復制代碼代碼如下:

var AppView = Backbone.View.extend({
  initialize: function(){
    this.render();
  },
  render: function(){
    $('main').append('<h1>一級標題</h1>');
  }
});
var appView = new AppView();

 

上面代碼定義了initialize方法之后,就省去了生成實例后,手動調用appView.render()的步驟。

el屬性,$el屬性

除了直接在render方法中,指定“視圖”所綁定的網頁元素,還可以用視圖的el屬性指定網頁元素。

復制代碼代碼如下:

var AppView = Backbone.View.extend({
  el: $('main'),
  render: function(){
    this.$el.append('<h1>一級標題</h1>');
  }
});

上面的代碼與render方法直接綁定網頁元素,效果完全一樣。上面代碼中,除了el屬性,還是$el屬性,前者代表指定的DOM元素,后者則表示該DOM元素對應的jQuery對象。

 

tagName屬性,className屬性

如果不指定el屬性,也可以通過tagName屬性和className屬性指定。

 

復制代碼代碼如下:

var Document = Backbone.View.extend({
  tagName: "li",
  className: "document",
  render: function() {
   // ...
  }
});

 

template方法

視圖的template屬性用來指定網頁模板。

復制代碼代碼如下:

var AppView = Backbone.View.extend({
      template: _.template("<h3>Hello <%= who %><h3>"),
});

上面代碼中,underscore函數庫的template函數,接受一個模板字符串作為參數,返回對應的模板函數。有了這個模板函數,只要提供具體的值,就能生成網頁代碼。
復制代碼代碼如下:

var AppView = Backbone.View.extend({
      el: $('#container'),
      template: _.template("<h3>Hello <%= who %><h3>"),
      initialize: function(){
        this.render();
      },
      render: function(){
        this.$el.html(this.template({who: 'world!'}));
      }
});

上面代碼的render就調用了template方法,從而生成具體的網頁代碼。

 

實際應用中,一般將模板放在script標簽中,為了防止瀏覽器按照JavaScript代碼解析,type屬性設為text/template。

復制代碼代碼如下:

<script type="text/template" data-name="templateName">
    <!-- template contents goes here -->
</script>

可以使用下面的代碼編譯模板。
復制代碼代碼如下:

window.templates = {};
var $sources = $('script[type="text/template"]');
$sources.each(function(index, el) {
    var $el = $(el);
    templates[$el.data('name')] = _.template($el.html());
});

 

events屬性

events屬性用于指定視圖的事件及其對應的處理函數。

復制代碼代碼如下:

var Document = Backbone.View.extend({
  events: {
    "click .icon":          "open",
    "click .button.edit":   "openEditDialog",
    "click .button.delete": "destroy"
  }
});

上面代碼中一個指定了三個CSS選擇器的單擊事件,及其對應的三個處理函數。

 

listento方法

listento方法用于為特定事件指定回調函數。

復制代碼代碼如下:

var Document = Backbone.View.extend({
  initialize: function() {
    this.listenTo(this.model, "change", this.render);
  }
});

上面代碼為model的change事件,指定了回調函數為render。

 

remove方法

remove方法用于移除一個視圖。

復制代碼代碼如下:

updateView: function() {
  view.remove();
  view.render();
};

 

子視圖(subview)

在父視圖中可以調用子視圖。下面就是一種寫法。

復制代碼代碼如下:

render : function (){
    this.$el.html(this.template());
    this.child = new Child();
    this.child.appendTo($.('.container-placeholder').render();
}

 

Backbone.Router

Router是Backbone提供的路由對象,用來將用戶請求的網址與后端的處理函數一一對應。

首先,新定義一個Router類。

復制代碼代碼如下:

Router = Backbone.Router.extend({
    routes: {
    }
});

 

routes屬性

Backbone.Router對象中,最重要的就是routes屬性。它用來設置路徑的處理方法。

routes屬性是一個對象,它的每個成員就代表一個路徑處理規則,鍵名為路徑規則,鍵值為處理方法。

如果鍵名為空字符串,就代表根路徑。

復制代碼代碼如下:

routes: {
        '': 'phonesIndex',
},
phonesIndex: function () {
        new PhonesIndexView({ el: 'section#main' });
}

星號代表任意路徑,可以設置路徑參數,捕獲具體的路徑值。
復制代碼代碼如下:

var AppRouter = Backbone.Router.extend({
    routes: {
        "*actions": "defaultRoute" 
    }
});
var app_router = new AppRouter;
app_router.on('route:defaultRoute', function(actions) {
    console.log(actions);
})

上面代碼中,根路徑后面的參數,都會被捕獲,傳入回調函數。

 

路徑規則的寫法。

復制代碼代碼如下:

var myrouter = Backbone.Router.extend({
  routes: {
    "help":                 "help",    
    "search/:query":        "search" 
  },
  help: function() {
    ...
  },
  search: function(query) {
    ...
  }
});
routes: {
  "help/:page":         "help",
  "download/*path":     "download",
  "folder/:name":       "openFolder",
  "folder/:name-:mode": "openFolder"
}
router.on("route:help", function(page) {
  ...
});

 

Backbone.history

設置了router以后,就可以啟動應用程序。Backbone.history對象用來監控url的變化。

復制代碼代碼如下:

App = new Router();
$(document).ready(function () {
    Backbone.history.start({ pushState: true });
});

打開pushState方法。如果應用程序不在根目錄,就需要指定根目錄。
復制代碼代碼如下:

Backbone.history.start({pushState: true, root: "/public/search/"})
Backbone.Model

Model代表單個的對象實體。
復制代碼代碼如下:

var User = Backbone.Model.extend({
        defaults: {
            name: '',
            email: ''
        }
});
var user = new User();

上面代碼使用extend方法,生成了一個User類,它代表model的模板。然后,使用new命令,生成一個Model的實例。defaults屬性用來設置默認屬性,上面代碼表示user對象默認有name和email兩個屬性,它們的值都等于空字符串。

 

生成實例時,可以提供各個屬性的具體值。

復制代碼代碼如下:

var user = new User ({
    id: 1,
    name: 'name',
    email: 'name@email.com'
});

上面代碼在生成實例時,提供了各個屬性的具體值。

 

idAttribute屬性

Model實例必須有一個屬性,作為區分其他實例的主鍵。這個屬性的名稱,由idAttribute屬性設定,一般是設為id。

復制代碼代碼如下:

var Music = Backbone.Model.extend({ 
    idAttribute: 'id'
});

 

get方法

get方法用于返回Model實例的某個屬性的值。

復制代碼代碼如下:

var user = new User({ name: "name", age: 24});
var age = user.get("age"); // 24
var name = user.get("name"); // "name"

 

set方法

set方法用于設置Model實例的某個屬性的值。

復制代碼代碼如下:

var User = Backbone.Model.extend({
    buy: function(newCarsName){
        this.set({car: newCarsName });
    }
});
var user = new User({name: 'BMW',model:'i8',type:'car'});
user.buy('Porsche');
var car = user.get("car"); // ‘Porsche'

 

on方法

on方法用于監聽對象的變化。

復制代碼代碼如下:

var user = new User({name: 'BMW',model:'i8'});
user.on("change:name", function(model){
    var name = model.get("name"); // "Porsche"
    console.log("Changed my car's name to " + name);
});
user.set({name: 'Porsche'}); 
// Changed my car's name to Porsche

上面代碼中的on方法用于監聽事件,“change:name”表示name屬性發生變化。

 

urlroot屬性

該屬性用于指定服務器端對model進行操作的路徑。

復制代碼代碼如下:

var User = Backbone.Model.extend({
    urlRoot: '/user'
});

 

上面代碼指定,服務器對應該Model的路徑為/user。

fetch事件

fetch事件用于從服務器取出Model。

復制代碼代碼如下:

var user = new User ({id: 1});
user.fetch({
    success: function (user){
        console.log(user.toJSON());
    }
})

上面代碼中,user實例含有id屬性(值為1),fetch方法使用HTTP動詞GET,向網址“/user/1”發出請求,從服務器取出該實例。

 

save方法

save方法用于通知服務器新建或更新Model。

如果一個Model實例不含有id屬性,則save方法將使用POST方法新建該實例。

復制代碼代碼如下:

var User = Backbone.Model.extend({
    urlRoot: '/user'
});
var user = new User ();
var userDetails = {
    name: 'name',
    email: 'name@email.com'
};
user.save(userDetails, {
    success: function (user) {
        console.log(user.toJSON());
    }
})

上面代碼先在類中指定Model對應的網址是/user,然后新建一個實例,最后調用save方法。它有兩個參數,第一個是實例對象的具體屬性,第二個參數是一個回調函數對象,設定success事件(保存成功)的回調函數。具體來說,save方法會向/user發出一個POST請求,并將{name: ‘name', email: ‘name@email.com'}作為數據提供。

 

如果一個Model實例含有id屬性,則save方法將使用PUT方法更新該實例。

復制代碼代碼如下:

var user = new User ({
    id: 1,
    name: '張三',
    email: 'name@email.com'
});
user.save({name: '李四'}, {
    success: function (model) {
        console.log(user.toJSON());
    }
});

上面代碼中,對象實例含有id屬性(值為1),save將使用PUT方法向網址“/user/1”發出請求,從而更新該實例。

 

destroy方法

destroy方法用于在服務器上刪除該實例。

復制代碼代碼如下:

var user = new User ({
    id: 1,
    name: 'name',
    email: 'name@email.com'
});
user.destroy({
    success: function () {
       console.log('Destroyed');
    }
});

上面代碼的destroy方法,將使用HTTP動詞DELETE,向網址“/user/1”發出請求,刪除對應的Model實例。

 

Backbone.Collection

Collection是同一類Model的集合,比如Model是動物,Collection就是動物園;Model是單個的人,Collection就是一家公司。

復制代碼代碼如下:

var Song = Backbone.Model.extend({});
var Album = Backbone.Collection.extend({
    model: Song
});

上面代碼中,Song是Model,Album是Collection,而且Album有一個model屬性等于Song,因此表明Album是Song的集合。

 

add方法,remove方法

Model的實例可以直接放入Collection的實例,也可以用add方法添加。

復制代碼代碼如下:

var song1 = new Song({ id: 1 ,name: "歌名1", artist: "張三" });
var song2 = new Music ({id: 2,name: "歌名2", artist: "李四" });
var myAlbum = new Album([song1, song2]);
var song3 = new Music({ id: 3, name: "歌名3",artist:"趙五" });
myAlbum.add(song3);

remove方法用于從Collection實例中移除一個Model實例。
復制代碼代碼如下:

myAlbum.remove(1);

上面代碼表明,remove方法的參數是model實例的id屬性。

 

get方法,set方法

get方法用于從Collection中獲取指定id的Model實例。

復制代碼代碼如下:

myAlbum.get(2))

 

fetch方法

fetch方法用于從服務器取出Collection數據。

復制代碼代碼如下:

var songs = new Backbone.Collection;
songs.url = '/songs';
songs.fetch();

Backbone.events
復制代碼代碼如下:

var obj = {};
_.extend(obj, Backbone.Events);
obj.on("show-message", function(msg) {
    $('#display').text(msg);
});
obj.trigger("show-message", "Hello World");

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品视频一区| 国产精品亚洲自拍| 亚洲美女av在线| 日韩欧美aⅴ综合网站发布| 色妞色视频一区二区三区四区| 国产精品久久久久影院日本| 成人免费看吃奶视频网站| 伊人久久久久久久久久| 成人福利在线观看| 91精品国产99久久久久久| 久久91亚洲精品中文字幕奶水| 欧美成人黄色小视频| 一区二区三区回区在观看免费视频| 国产极品jizzhd欧美| 国产精品igao视频| 成人黄色av网站| 中文字幕欧美精品日韩中文字幕| 亚洲专区在线视频| 日韩有码片在线观看| 日韩毛片在线观看| 欧美另类极品videosbestfree| 国内精品国产三级国产在线专| 亚洲精品久久久一区二区三区| 国产精品日韩专区| 伊人久久男人天堂| 欧美午夜激情小视频| 91精品国产综合久久香蕉922| 久久综合伊人77777蜜臀| 国产精品av免费在线观看| 日韩中文字幕在线免费观看| 亚洲第一区在线观看| 国产成人综合久久| 成人高清视频观看www| 国产精品夫妻激情| 欧美综合一区第一页| 欧美性xxxxxxxxx| 国产成人在线一区二区| 2019亚洲男人天堂| 国产一区二区三区视频免费| 国产精品欧美日韩久久| 丝袜美腿亚洲一区二区| 91精品啪aⅴ在线观看国产| 日韩视频永久免费观看| 久久成人一区二区| 秋霞午夜一区二区| 欧美精品日韩www.p站| 欧美性开放视频| 91在线播放国产| 精品在线欧美视频| 欧美一区三区三区高中清蜜桃| 国产女人精品视频| 91中文字幕在线观看| 国产视频自拍一区| 日韩精品极品在线观看播放免费视频| 久久久精品一区| 成人国产精品久久久久久亚洲| 欧亚精品在线观看| 国外成人免费在线播放| 日韩av综合网| 久久久欧美精品| 久久九九有精品国产23| 亚洲成年人在线| 亚洲免费av片| 91精品国产网站| 成人97在线观看视频| 91麻豆国产精品| 国产精品ⅴa在线观看h| 97超级碰碰碰久久久| 日韩欧美在线视频| 亚洲аv电影天堂网| 在线精品国产成人综合| 91精品国产综合久久男男| 日韩精品在线免费播放| 日韩av一区二区在线| 最新国产成人av网站网址麻豆| 一区二区三区国产在线观看| 毛片精品免费在线观看| 久久免费国产视频| 日韩福利在线播放| 日韩av中文字幕在线免费观看| 亚洲国产天堂久久国产91| 日韩欧美极品在线观看| 久久午夜a级毛片| 亚洲综合最新在线| 日韩成人高清在线| 日产精品99久久久久久| 欧美亚洲国产日韩2020| 日韩激情视频在线播放| 日韩在线视频观看| 欧美人与性动交a欧美精品| 精品国产区一区二区三区在线观看| 精品露脸国产偷人在视频| 国产69精品久久久| 国产国产精品人在线视| 欧美精品成人91久久久久久久| 97在线看福利| 亚洲人午夜色婷婷| 国产精品日韩欧美大师| 亚洲一区二区在线| 综合欧美国产视频二区| 久久久久中文字幕| 日本亚洲欧洲色α| 国产欧美一区二区| 欧美亚洲视频一区二区| 欧美野外猛男的大粗鳮| 亚洲乱码av中文一区二区| 精品国偷自产在线视频99| 亚洲人成在线观| 中文字幕亚洲一区| 久久69精品久久久久久国产越南| 97精品国产aⅴ7777| 欧美极品xxxx| 成人午夜高潮视频| 国模叶桐国产精品一区| 国产亚洲欧美日韩一区二区| 91精品国产99久久久久久| 国产欧美中文字幕| 91免费看片在线| 国产91精品在线播放| 亚洲一区亚洲二区| 亚洲高清久久久久久| 亚洲国产精品久久| 国产日韩精品入口| 成人在线播放av| 国产成人免费av| 日韩av片永久免费网站| 日韩成人黄色av| 51久久精品夜色国产麻豆| 亚洲精品免费网站| 日韩中文字幕欧美| 国产精品美女主播在线观看纯欲| 亚洲福利视频网站| 国产精品91一区| 欧美丰满老妇厨房牲生活| 精品久久中文字幕久久av| 亚洲精品久久久久中文字幕欢迎你| 久久久国产视频91| 久久偷看各类女兵18女厕嘘嘘| 欧美日韩国产123| 久久久这里只有精品视频| 亚洲欧美成人网| 日本一区二区在线播放| 97超碰蝌蚪网人人做人人爽| 成人黄色av播放免费| 久久综合88中文色鬼| 热久久99这里有精品| 亚洲男人天堂网| 亚洲成人a级网| 亚洲欧美日本精品| 亚洲a区在线视频| 国产美女久久精品香蕉69| 91青草视频久久| 91高清视频在线免费观看| 粉嫩老牛aⅴ一区二区三区| 成人av.网址在线网站| 91免费看视频.| 成人看片人aa| 亚洲男人av在线| 亚洲第一视频网站| 97福利一区二区| 欧美日韩国产成人高清视频| 欧美孕妇孕交黑巨大网站| 8090成年在线看片午夜| 亚洲视频专区在线|