Rückgrat: Hinzufügen eines Modells für die Erhebung und das Rendern einer Ansicht
Baue ich eine einfache Backbone-app, wo ich hauptsächlich eine Ansicht mit einer Liste der Bücher (book name + cover-Bild) und einer anderen Ansicht, wo ich will neue Bücher hinzufügen, um der Liste.
Wenn ich mit einem sample-Daten werden in der Ansicht der Bücher macht richtig, aber wenn ich versuche, um Bücher auf der Liste, es funktioniert nicht und ich weiß nicht, was das problem ist.
Hier ist das JSFiddle http://jsfiddle.net/swayziak/DRCXf/4/ und mein code:
HTML:
<section class="menu">
<ul class="footer">
<li><a href="">List of Books</a></li>
<li><a href="#edit">Edit</a></li>
<li><a href="#about">About</a></li>
</ul>
</section>
<section class="feed"></section>
<script id="bookTemplate" type="text/template">
<img src="<%= image %>"/>
<h2 class="bookTitle"><%= title %><h2>
</script>
<script id="aboutTemplate" type="text/template"> About </script>
<script id="editTemplate" type="text/template">
<form id="addBook" action="#">
<label for="title">Book Title</label><input type="text" id="title">
<label for="image">Image Link</label><input type="text"/ id="image">
<button id="add-book">Button</button>
</form>
</script>
</div>
Und die Backbone-code:
app = {};
//Beispieldaten
var books = [
{title:'Imperial Bedrooms', image:'http://upload.wikimedia.org/wikipedia/en/thumb/e/e8/Imperial_bedrooms_cover.JPG/200px-Imperial_bedrooms_cover.JPG
},
{title:'Less than zero',
image:'http://d.gr-assets.com/books/1282271923l/9915.jpg'
},
];
//Router
app.Router = Backbone.Router.extend({
routes: {
'' : 'home',
'about' : 'about',
'edit' : 'edit',
},
home: function () {
if(!this.bookListView){
this.bookListView = new app.BookListView(books);
}else{
this.bookListView.render();
}
},
about: function () {
if (!this.aboutView) {
this.aboutView = new app.AboutView();
}
$('.feed').html(this.aboutView.render().el);
},
edit: function () {
if (!this.editView) {
this.editView = new app.EditView();
);
$('.feed').html(this.editView.render().el);
}
});
//Modell
app.Book = Backbone.Model.extend({
defaults: {
title:'',
image:'',
}
});
//Sammlung
app.BookList = Backbone.Collection.extend ({
model: app.Book
});
//Buch-Ansicht
app.BookView = Backbone.View.extend ({
tagName: 'div',
className: 'book',
template: _.template( $( '#bookTemplate' ).html()),
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
//Liste der Bücher, die Ansicht
app.BookListView = Backbone.View.extend({
el: '.feed',
initialize: function ( initialBooks ) {
this.collection = new app.BookList (initialBooks);
this.render();
this.listenTo( this.collection, 'add', this.renderBook );
},
render: function() {
this.$el.empty();
this.collection.each(function( item ){
this.renderBook( item );
}, this);
},
renderBook: function ( item ) {
var bookview = new app.BookView ({
model: item
});
this.$el.append( bookview.render().el );
}
});
//Bücher hinzufügen view
app.EditView = Backbone.View.extend({
tagName: 'div',
className: 'edit',
template: _.template( $( '#editTemplate' ).html()),
events:{
"click #add-book":"addBook"
},
addBook:function(e){
e.preventDefault();
var title = this.$el.find("#title").val();
var image = this.$el.find("#image").val();
var bookModel = new app.Book({title:"title",image:'image'});
},
render: function () {
this.$el.html(this.template());
return this;
}
});
//Ansicht
app.AboutView = Backbone.View.extend({
tagName: 'div',
className: 'about',
template: _.template( $( '#aboutTemplate' ).html()),
render: function () {
this.$el.html(this.template());
return this;
}
});
});
var router = new app.Router();
Backbone.history.start();
Ich denke, das problem ist im Zusammenhang mit der Home-router, die app.BookListView und der app.EditView, aber ich bin mir nicht sicher.
Jede Hilfe ist willkommen.
Dank.
- Für den Anfang, es ist eine fehlgeleitete
});
in Zeile 142 von deinem jsfiddle code. Der Blick scheint zu Rendern, wenn ich einen Kommentar jsfiddle. Wenn Sie ein zusätzliches problem bitte lösen Sie Ihren code ein und klären : )
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem Beispiel..der Einfachheit halber definiere einen globalen Bücher-Sammlung.
app.books = new app.BookList(books);
Übergeben Sie Ihre Bücher-Sammlung auf editView & BookListView in Ihrem router:
In Sie editView Sie brauchen, um einige änderungen an Ihrer
addBook
Funktion:In Ihrem
BookListView
nehmen Sie die folgenden änderungen an derinitialize
Funktion:Hier ist ein Turnschuh, mit den änderungen: http://jsfiddle.net/9R9zU/
comparator
Funktion. Man kann darüber Lesen, dass hier. Wenn Sie Schwierigkeiten haben, es umzusetzen, sollten Sie eine separate Frage, da es ein separates problem. Wenn meine Antwort zu einer Lösung des ursprünglichen Problems, sollten Sie markieren es als angenommen.