简体   繁体   中英

Create new Backbone Views in click event of Backbone View

in the click event of the PodcastView I would like to create multiple new PodcastItemView objects. The jquery $.get works flawlessly, btw.

If I do console.debug(this.pinfo) in the start-function, I receive the JSON array of my podcast items (title, desc, url,...), so this is not the problem. Also it iterates x times through this array, so this works, too.

PodcastView = Backbone.View.extend({
    tagName: "li",
    itemTpl: _.template($("#podcast-item").html()),
    events: {
        "click .p-click" : "start"
    },
    initialize: function() {
        this.listenTo(this.model, "change", this.render);
    },
    render: function() {
        this.$el.html(this.itemTpl(this.model.toJSON()));
        return this;
    },
    start: function() {
        $.get(restUri + "podcast/" + this.model.get("title") + "/items", _.bind(function(data) {
            this.pinfo = data;
            _.each(this.pinfo, function(o) {
                var v = new PodcastItemView({model: o});
                $("#podcast-items").append(v.render().el);
            }, this);
        }));
    }
});

What does not work, however, is the the creation of new PodcastItemView and to append them to #podcast-items. I get the following error:

TypeError: obj[implementation] is not a function (Backbone.js:225)

This is my PodcastItemView.

PodcastItemView = Backbone.View.extend({
        tagName: "div",
        itemTpl: _.template($("#podcast-item-list").html()),
        initialize: function() {
            this.listenTo(this.model, "change", this.render);
        },
        render: function() {
            this.$el.html(this.itemTpl(this.model.toJSON()));
            return this;
        }
    });

I am thankful for every tip or response.

Rewrite the start function to:

start: function() {
        $.get(restUri + "podcast/" + this.model.get("title") + "/items", _.bind(function(data) {
            this.pinfo = data;
            _.each(this.pinfo, function(o) {
                var model = new Backbone.Model(o)  
                var v = new PodcastItemView({model: model});
                $("#podcast-items").append(v.render().el);
            }, this);
        }));

As mentioned in comments your code fails because you are trying to bind native object to the view instead of Backbone.Model.

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM