Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $(this.el).find()在事件处理程序中工作,而不是在初始化函数(backbone.js)中工作_Javascript_Jquery_Backbone.js_Underscore.js - Fatal编程技术网

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

Javascript $(this.el).find()在事件处理程序中工作,而不是在初始化函数(backbone.js)中工作,javascript,jquery,backbone.js,underscore.js,Javascript,Jquery,Backbone.js,Underscore.js,我正在使用backbone.js创建一个视图,其中包含一个类似于的按钮。此视图的模型包含属性is_Like,如果其值为1,则调用的函数setStateLike将更改Like按钮的样式 问题:我无法使用函数中的this.setStateLike()选择按钮。这样做只会返回一个[]。但是,当我将this.setStateLike定义为click事件处理程序时,选择按钮是有效的!奇怪的是initialize中调用的this.setStateLike()能够选择$(this.el),但不能选择$(thi

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

问题:我无法使用
函数中的
this.setStateLike()
选择按钮。这样做只会返回一个
[]
。但是,当我将
this.setStateLike
定义为click事件处理程序时,选择按钮是有效的!奇怪的是
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尚未实际构建,因此无法选择任何元素。在
末尾运行脚本,或者使用。

使用
this.$el
而不是
$(this.el)
保存键入注意@Austin建议先分配
this.$el
,然后再使用它,而不是
$(this.el)
。这样做的最佳原因不是为了节省击键次数,而是为了提高性能:将DOM元素包装到jQuery对象中需要付出努力,最好只做一次,而不是反复进行。我很确定Backbone.View定义了
this.$el
this.el
,不需要赋值。这是否意味着我需要调用
$(this.el)
一次来创建缓存,然后再使用
this.$el
?或者当视图由backbone.js呈现时,
this.el
已经被创建为
$(this.el)
的缓存了吗?这个问题可能只是我的问题,而不是整个语句
$(this.el).find(''like.photo_btn').addClass('photo_btn_active').attr('id,'distributed')看起来完全错了。如果您可以通过id来标识元素(并且id在DOM中应该是唯一的),那么为什么还要麻烦使用前导呢。这是一个重复元素,您应该使用一个类而不是id,或者它是唯一的且
$('#like.photo_btn').addClass('photo_btn_active').attr('id','inspect')将正确地对其进行寻址。我还质疑更改元素的id,这是非常规的,可能会造成混乱this.render()的结尾处添加code>到,现在就可以使用了。