一旦事件执行了主干js,就无法刷新视图

时间:2016-02-25 13:50:33

标签: backbone.js listener render

这是我的主干观点:

View.ModelUploadView = Backbone.ItemView.extend({
        template : modelUploadTpl,

        events : {
            "click a.js-updadeModel" : "updateModel",
        },

        initialize : function() {
            _.bindAll(this, 'render');
            this.model.bind('change', this.render);
            this.listenTo(this, "model:update", this.render);
        },

        updateModel : function() {
            this.trigger("model:update", this.model.get("id"));
        },

当执行我的事件点击时,模型将被更新,因此我需要使用模型的新值渲染视图。 为此,我使用了监听器this.listenTo(this, "model:update", this.render);,但它不起作用。每次我需要手动刷新页面以获取更新的模型。 任何解决方案???

3 个答案:

答案 0 :(得分:0)

您很可能已经超载了 GET https://<host>.com/my_url 功能,或者在其他位置重新分配了Backbone View的 render

您唯一需要记住的是视图的事件被绑定到具体的el。因此,如果为视图创建新的DOM node(例如在渲染函数中),则需要手动调用Backbone.View.delegateEvents。

答案 1 :(得分:0)

Backbone中没有默认渲染,您必须为每个视图编写渲染。然后,您应该听取模型更改,例如(视图的内部初始化方法):

private int mViewState = 0;
    @Override
    public void onPause() {
        super.onPause();
        setViewState(mViewState & ~1);
    }

    @Override
    public void onResume() {
        super.onResume();
        setViewState(mViewState | 1);
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        setViewState(mViewState);
    }

    private void setViewState(int newState) {
        newState = getUserVisibleHint() ? newState | 2 : newState & ~2;
        if (newState == 3 && mViewState != 3){
        // I'm visible
        }else if (newState != 3 && mViewState == 3) {
        // I'm hidden
        }
        mViewState = newState;
    }

每次模型属性更改并呈现视图时,都会触发更改事件。 在您的DOM事件处理程序中,您不必为模型触发更改事件,您只需使用this.model.set()来更改它的属性。

答案 2 :(得分:0)

你可以覆盖这样的render函数。

View.ModelUploadView = Backbone.ItemView.extend({
    template : modelUploadTpl,

    events : {
        "click a.js-updadeModel" : "updateModel",
    },

    initialize : function() {
        _.bindAll(this, 'render');
        this.model.bind('change', this.render);
        this.listenTo(this, "model:update", this.render);
    },

    updateModel : function() {
        this.trigger("model:update", this.model.get("id"));
    },

    render: function() {
        this.$el.html(this.template(this.model.attributes));
        return this;
    }