Предположим, я создаю простое приложение, которое позволяет мне добавлять фильмы и отображать их в списке. Вот мой код (тело):Создайте новую модель в View.event Backbone.js
<div id="container-addmovie"></div>
<p>Movies:</p>
<ul id="container-movie"></ul>
<!-- templates -->
<!-- Movie template -->
<script type="text/template" id="template-movie">
<li><strong>Title: </strong><%=title%>; <strong>Rating: </strong><%=mpaaRating%></li>
</script>
<!-- add movie template -->
<script type="text/template" id="template-addmovie">
<input type="text" name="" id="input-addmovie">
<input type="button" name="" id="button-addmovie" value="Add new movie">
</script>
<!-- models -->
<!-- movie model -->
<script type="text/javascript">
var Movie = Backbone.Model.extend({});
</script>
<!-- views -->
<!-- movie view -->
<script type="text/javascript">
var MovieView = Backbone.View.extend({
el: "#container-movie",
template: _.template($("#template-movie").html()),
initialize: function() {
// model reder
this.render();
// change event
this.listenTo(this.model, "change", this.render);
},
render: function() {
console.log("MovieView render; Movie Title: " + this.model.get("title"));
var htmlOutput = this.template(this.model.toJSON());
this.$el.html(htmlOutput);
return this;
}
})
</script>
<!-- add movie view -->
<script type="text/javascript">
var AddMovieView = Backbone.View.extend({
initialize: function() {
// model reder
this.render();
},
render: function() {
var template = _.template($("#template-addmovie").html());
this.$el.html (template);
},
events: {
"click input[type=button]": "addNewMovie"
},
addNewMovie: function (event) {
var movieModel = new Movie({ title: $("#input-addmovie").val(), mpaaRating: "R" });
var movieView = new MovieView({ model: movieModel });
}
})
</script>
<script type="text/javascript">
var addMovie = new AddMovieView({el: $("#container-addmovie")})
</script>
Проблема заключается в том, когда я начала addNewMovie
событие ...
var movieModel = new Movie({ title: $("#input-addmovie").val(), mpaaRating: "R" });
var movieView = new MovieView({ model: movieModel });
... Я не создавая новую модель, но перезапись выхода. Таким образом, никаких новых li в ul не создается, а выходящих изменений. Вопрос заключается в следующем: как создать новую модель каждый раз, когда я инициирую событие addNewMovie и визуализирую его (вставьте новый li в его контейнер)? Думаю, мне нужны какие-то коллекции.
ОБНОВЛЕНО (добавлена коллекция):
<div id="container-addmovie"></div>
<p>Movies:</p>
<ul id="container-movie"></ul>
<!-- templates -->
<!-- Movie template -->
<script type="text/template" id="template-movie">
<li><strong>Title: </strong><%=title%>; <strong>Rating: </strong><%=mpaaRating%></li>
</script>
<!-- add movie template -->
<script type="text/template" id="template-addmovie">
<input type="text" name="" id="input-addmovie">
<input type="button" name="" id="button-addmovie" value="Add new movie">
</script>
<!-- models -->
<!-- movie model -->
<script type="text/javascript">
var Movie = Backbone.Model.extend({});
</script>
<!-- collections -->
<script type="text/javascript">
var MovieCollection = Backbone.Collection.extend({
model: Movie,
addMovie: function(element) {
return this.add(element);
}
});
</script>
<!-- views -->
<!-- movie view -->
<script type="text/javascript">
var MovieView = Backbone.View.extend({
el: "#container-movie",
template: _.template($("#template-movie").html()),
initialize: function() {
// model reder
this.render();
// change event
this.listenTo(this.model, "change", this.render);
},
render: function() {
console.log("MovieView render; Movie Title: " + this.model.get("title"));
var htmlOutput = this.template(this.model.toJSON());
this.$el.html(htmlOutput);
return this;
}
})
</script>
<!-- add movie view -->
<script type="text/javascript">
var AddMovieView = Backbone.View.extend({
initialize: function() {
// model reder
this.render();
this.collection = new MovieCollection();
},
render: function() {
var template = _.template($("#template-addmovie").html());
this.$el.html (template);
},
events: {
"click input[type=button]": "addNewMovie"
},
addNewMovie: function (event) {
var elementMovie = { title: $("#input-addmovie").val(),mpaaRating:"R"};
this.movieModel = new Movie(elementMovie);
console.log (elementMovie);
this.collection.addMovie(this.movieModel);
}
})
</script>
<script type="text/javascript">
var addMovie = new AddMovieView({el: $("#container-addmovie")})
</script>
и я все еще получаю TypeError: 'undefined' is not an object (evaluating 'this.collection.addMovie')
Спасибо, и извините за нуб вопрос.
Не могли бы Вы более конкретно: где именно я должен создать новый коллекция с 'this.collection = new MovieCollection();'? В 'MovieView' инициализироваться или в' AddMovieView'? Теперь я получаю 'ypeError: 'undefined' не объект (оценка 'this.collection.addElement')'. Спасибо за ваш ответ. – jlayne
Кстати, я полагаю, вы имели в виду 'elementMovie' во второй строке и' addMovie' на третьем, да? Во всяком случае, я до сих пор получаю сообщение об ошибке 'TypeError: 'undefined' не является объектом (оценивая 'this.collection.addMovie')'. И все в порядке, мы создаем новую коллекцию с каждым новым экземпляром представления? – jlayne
Пожалуйста, посмотрите - я обновил свой код – jlayne