Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.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
Jquery 在主干afterRender()内访问时未更新Dom元素_Jquery_Backbone.js_Render_Backbone Views_Backbone Events - Fatal编程技术网

Jquery 在主干afterRender()内访问时未更新Dom元素

Jquery 在主干afterRender()内访问时未更新Dom元素,jquery,backbone.js,render,backbone-views,backbone-events,Jquery,Backbone.js,Render,Backbone Views,Backbone Events,下面是我的render()函数: initialize: function() { this.selectDivView = new SelectView({ url: '/ir/secure/api/v40/myvariants/myVariantDBs', method: 'POST', template: myVariantDBFilterTemplate }); }, render: function() { t

下面是我的render()函数:

initialize: function() {
    this.selectDivView = new SelectView({
        url: '/ir/secure/api/v40/myvariants/myVariantDBs',
        method: 'POST',
        template: myVariantDBFilterTemplate
     });
},

render: function() {
    this.$el.html(template()); //has div for "select drop down"
    this.selectDivView.setElement(this.$(this._selectDivId)).render();
    this.afterRender();
},

afterRender: function() {
    this.$(this._selectEl).val();
    //Expected to get some value but the select control is not yet rendered in dom
}
我试着用这个链接中提到的方式来做 但无法访问DOM元素

这是我的Select控件的把手模板selectDiv.html

{{#each filters}}
<option value="{{id}}">{{name}}</option>
{{/each}}

您是否手动绑定afterRender

initialize: function(options) { 
  _.bindAll(this, 'beforeRender', 'render', 'afterRender'); 
  var _this = this; 
  this.render = _.wrap(this.render, function(render) { 
    _this.beforeRender(); 
    render(); 
    _this.afterRender(); 
  });
},

render: function() {
    this.$el.html(template()); //has div for "select drop down"
    this.selectDivView.setElement(this.$(this._selectDivId)).render();
    return this;
},

afterRender: function() {
    this.$(this._selectEl).val();
}
添加ajax属性

async: false
在渲染功能中,selectDivView解决了这个问题

下面是selectdiv的render函数的样子

render: function(selectedValue) {
    this.selectedValue = selectedValue;
        $.ajax({
            url: this.url,
            method: this.method,
            async: false,  // THIS IS THE DECIDING PROPERTY.
            success: function(data) {
                    that.filters = data;
                    that._doRender.call(that);
            }
        });
}

我就是这么做的。但是在渲染后的内部,选择控件还没有使用选项进行渲染。我明白了。在afterRender内部停止时,是否可以使用控制台找到选择控件?或者根本就没有渲染?我可以在控制台中看到select控件。但它不使用选项进行渲染。但一旦退出浏览器上的afterRender(),我就可以正确地看到包含所有值的select控件。已尝试。它不起作用了。我猜这也是你之前建议的。也许你在
selectDivView
render
方法中做了一些异步的事情。除非我们看到代码,否则我们无法确定。请分享@t-j,非常感谢。您的语句“也许您正在selectDivView的呈现方法中执行异步操作”给了我答案。您好,同步ajax请求已被弃用。。。如果你正在使用最新版本的浏览器,比如chrome,你应该在开发者工具中看到一条警告。。。最好在请求成功后返回xhr对象并访问该值
render: function(selectedValue) {
    this.selectedValue = selectedValue;
        $.ajax({
            url: this.url,
            method: this.method,
            async: false,  // THIS IS THE DECIDING PROPERTY.
            success: function(data) {
                    that.filters = data;
                    that._doRender.call(that);
            }
        });
}