Javascript MVC架構Backbone.js詳解,mvcbackbone.js

來源:互聯網
上載者:User

Javascript MVC架構Backbone.js詳解,mvcbackbone.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兩個屬性,它們的值都等於Null 字元串。

產生執行個體時,可以提供各個屬性的具體值。
複製代碼 代碼如下:
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");


Javascript有mvc架構?

你應該回答
MVC模式應該在程式員的心中,這樣隨時可用
而不應該僅存在於運用別人的架構上,這樣沒有架構就沒法用。
 
javascript什mvc架構可應用在IE6上?

很奇怪什麼叫javascript的mvc,孤陋寡聞了,百度了一下,網上推薦用Angular.js的比較多,那個以前聽過是Google寫的,各方面應該都有保證。。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.