【问题标题】:backbone.js view events not firing骨干.js 视图事件未触发
【发布时间】:2012-01-12 00:57:11
【问题描述】:

我是一个骨干.js n00b,所以请多多包涵。

我正在尝试使用backbone.js 动态生成联系人列表,并为每个联系人附加一个onclick 事件处理程序,但无济于事。我的视图呈现正常,但单击事件未注册。这是我的代码:

App.Views.Contact = Backbone.View.extend({

initialize: function() {
  this.render();
},

events: {
  'click': 'select',
},

select: function(event) {
  console.log('contact selected');
},

render: function() {
  $('#contacts').append(tmplContact(this.model.toJSON()));
}

});

更新:这里是对应集合的代码

App.Collections.Contact = Backbone.Collection.extend({

  initialize: function() {
    this.bind('reset', function() {
      console.log('COLLECTION RESET');
    });
  },

  model: App.Models.Contact,

  comparator: function(model) {
    return model.get('name');
  }

});

更新 #2:集合初始化和填充

App.Collections.roster = new App.Collections.Contact;

function getContacts() {
    socketRequest('friends', function(data) {App.Collections.roster.reset(data)});
}

更新 #3:模型定义

App.Models.Contact = Backbone.Model.extend({
  initialize: function() {
    this.set({id: this.get('token')});
    this.set({avatar: parseAvatar(this.get('avatar'))});
    this.set({name: parseName(this.toJSON())});
    this.set({view: new App.Views.Contact({model: this})});
  },

  defaults: {
    username: ''
  }
});

【问题讨论】:

  • 你也在使用合集吗?

标签: javascript jquery backbone.js


【解决方案1】:

您需要使用 View.el 属性才能使事件正常工作。

App.Collections.Contact = Backbone.Collection.extend({

    initialize: function() {
        this.bind('reset', function() {
            console.log('COLLECTION RESET');
        });
    },

    model: App.Models.Contact,

    comparator: function(model) {
        return model.get('name');
    },

    render: function() {
        ;
    }

});

App.Views.Contacts = Backbone.View.extend({

    el: '#contacts',

    initialize: function() {
        this.collection = new App.Collection.Contact;
        this.collection.bind('reset', this.render, this);

        var that = this;
        socketRequest('friends', function(data) {
            this.reset(data);
        });
    },

    render: function() {
        $(this.el).html('put your template here');
        this.collection.each(this.addOne, this);
        return this;
    },

    addOne: function(contact) {
        var view = new App.Views.Contact({model: contact});
        contact.view = view; // in case you need the ref on the model itself
        $(this.el).append(view.render().el);
    }

});

App.Views.Contact = Backbone.View.extend({

    el: '',

    tagName: 'div',

    events: {
        'click': 'select',
    },

    select: function(event) {
        console.log('contact selected');
    },

    render: function() {
        $(this.el).html(htmltmplContact(this.model.toJSON()));
        return this;
    }

});

对模型代码的小改进:
(请注意,我删除了视图创建,这很重要!)

App.Models.Contact = Backbone.Model.extend({

    parse: function(c) {
        c.id = c.token;
        c.avatar = parseAvatar(c.avatar);
        c.name = parseName(c);
        return c;
    },

    defaults: {
        username: ''
    }
});

然后开始:

App.Views.roster = App.Views.Contacts;

【讨论】:

  • 问题是我有不止一个联系人,而且我没有(也不会)每个元素都有不同的 ID,因此无法弄清楚如何设置适当的 el 属性。有什么想法吗?
  • 这很容易解决。只需使用集合的代码更新您的帖子,我可以为您提供修复。
  • 抱歉,我还需要一件事...集合视图的代码(您在其中创建集合并迭代模型,创建联系人视图)
  • 刚刚更新了我的答案。添加了一个新的联系人视图,它基本上是一个集合视图,并在那里添加了你的 socketRequest 调用,应该可以工作:)
  • 刚刚看到我的代码中有一个错误... App.Views.Contacts#addOne 现已修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
相关资源
最近更新 更多