2011-03-28 102 views
4

希望你能快速看看我在這裏做什麼。從本質上講,我做對了嗎?骨幹基礎應用程序,這是應該怎麼做?

它的現場演示在這裏太:http://littlejim.co.uk/code/backbone/messing-around/

我只是想獲得一個堅實的理解的骨幹,我去太野了。所以這是一個簡單的演示,從JSON對象創建一個集合,將它傳遞給視圖並處理簡單的事件。但我接近這個權利?我能做些什麼更好?

<!DOCTYPE html> 

<html lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>Showing a simple view with events</title> 
    <script type="text/javascript" src="../../media/scripts/jquery-1.5.1.min.js"></script> 
    <script type="text/javascript" src="../../media/scripts/underscore-min.js"></script> 
    <script type="text/javascript" src="../../media/scripts/backbone-min.js"></script> 

    <script type="text/javascript" src="application.js"></script> 
</head> 
<body> 

    <header> 
     <h1>Showing views from a collection and basic events</h1> 
     <p>The list below is made from JSON, passed to the view as a collection and has basic events</p> 
    </header> 

    <article> 

    </article> 

</body> 
</html> 

這是我現在擁有的JavaScript。我只需要知道我是否正確接近這個問題?

window.App = { 

    // namespaces 
    Controller: {}, 
    Model : {}, 
    Collection : {}, 
    View : {}, 

    // code that starts when the app is first fired 
    initialize : function() { 

     var collection = new App.Collection.Inputs([ 
      {title: "Item 1"}, 
      {title: "Item 2"}, 
      {title: "Item 3"} 
     ]); 

     var view = new App.View.InputSet({collection: collection}); 
     $('article').html(view.render().el); 

    } 
} 

/* 
Collection: Inputs */ 
App.Collection.Inputs = Backbone.Collection.extend(); 

/* 
View: _Input */ 
App.View._Input = Backbone.View.extend({ 
    events: { 
     "click a": "close" 
    }, 
    // called as soon as a view instance is made 
    initialize: function() { 
     // this makes the render, clear etc available at this 
     // if not setting this, both render() and clear() method will not have themselves in this 
     _.bindAll(this, "render", "close"); 
    }, 
    // backbone required method, which renders the UI 
    render: function() { 
     // this is using underscore templating, which can be passed context 
     $(this.el).html(_.template('<p><%=title%> <a href="#">[close]</a></p>', this.model.toJSON())); 
     return this; 
    }, 
    close: function() { 
     // removes the UI element from the page 
     $(this.el).fadeOut(300); 
     return false; // don't want click to actually happen 
    } 
}); 

/* 
View: InputSet, uses _Input */ 
App.View.InputSet = Backbone.View.extend({ 
    events: { 
     'click a': 'clear' 
    }, 
    initialize: function() { 
     // this makes the render, clear etc available at this 
     // if not setting this, both render() and clear() method will not have themselves in this 
     _.bindAll(this, "render"); 
    }, 
    // backbone required method, which renders the UI 
    render: function() { 

     var that = this; 

     views = this.collection.map(function(model) { 
      var view = new App.View._Input({model: model}); 
      $(that.el).append(view.render().el); 
      return view; 
     }); 

     $(that.el).append('<a href="#">[clear]</a>'); 

     return this; 
    }, 
    clear: function() { 
     $(this.el).find('p').fadeOut(300); 
    } 
}); 

// wait for the dom to load 
$(document).ready(function() { 
    // this isn't backbone. this is running our earlier defined initialize in App 
    App.initialize(); 
}); 

回答

2

這對我來說很好。然而,我發現,一旦你開始做非平凡的東西,事情會變得棘手:複雜的意見,嵌套集合等。

有一件事可以做不同的事情,而不是使用collection.map生成輸入視圖,你可以綁定集合的add事件轉換爲爲集合中的該項目生成_Input視圖的功能。所以你在你的InputSet視圖中有這樣的東西:

initialize: function() { 
    _.bindAll(this, "addInput", "removeInput"); 
    this.collection.bind("add", this.addInput); 
    this.collection.bind("remove", this.removeInput); 
} 

addInput: function(model) { 
    var view = new App.View._Input({model: model}); 
    $(this.el).append(view.render().el); 
} 
0

我對我來說很好 - 真的,我建議的唯一的事情是,你自動綁定集合的'change'事件_Input.render這樣的變化到您的收藏重新渲染視圖:

// called as soon as a view instance is made 
initialize: function() { 
    _.bindAll(this, "render", "close"); 
    this.collection.bind('change', this.render); 
}, 

除此之外,我認爲它看起來不錯!