$(this.el).find()在事件处理程序中工作,而不是在初始化函数(主干.js)中工作

$(this.el).find() works in event handler, not in initialize function (backbone.js)

本文关键字:工作 初始化 函数 js 主干 事件处理 el 程序 this find      更新时间:2023-12-18

我正在使用backbone.js创建一个包含Like按钮的视图。此视图的模型包含属性is_liked,如果其值为1,则调用的函数setStateLike将更改Like按钮的样式。

问题:我无法使用initialize功能中的this.setStateLike()选择按钮。这样做只会返回一个[]。但是,当我将this.setStateLike定义为单击事件处理程序时,选择按钮就可以了!奇怪的是,在initialize内调用的this.setStateLike()能够选择$(this.el),但不能选择$(this.el).find()

你知道这里发生了什么吗?怎么才能解决?谢谢

PhotoListItemView = Backbone.View.extend({
    tagName: 'div',
    className: 'photo_box',
    events: {
        'click': 'setStateLike'
    },
    initialize: function() {
        this.setStateLike();
    },
    render: function() {
        $(this.el).html( this.template( this.model.toJSON() ) );
        return this;
    },
    setStateLike: function() {
        console.log( $(this.el).find('#like') );  // returns []
        if(this.model.get('is_liked')) {
            console.log( $(this.el) );        // returns correctly
            console.log( $(this.el).find('#like') );  // returns []
            // Change icon to Active state
            $(this.el).find('#like.photo_btn').addClass('photo_btn_active').attr('id', 'unlike');
        }
    }
});

如果您的脚本位于主体HTML的主体之前,并且initialize函数被立即调用,那么问题就出在您身上:DOM实际上还没有构建,因此无法选择任何元素。要么在</body>的末尾运行脚本,要么使用jQuery的DOM就绪处理程序。