Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/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
view.render()完成后的Backbone.js事件_Backbone.js - Fatal编程技术网

view.render()完成后的Backbone.js事件

view.render()完成后的Backbone.js事件,backbone.js,Backbone.js,有人知道在backbone.js中呈现视图后会触发哪个事件吗?据我所知-。源代码中的Render函数为空 渲染的默认实现是无操作 我建议在必要时手动触发它 constructor: function(){ Backbone.View.call(this, arguments); var oldRender = this.render this.render = function(){ oldRender.call(this) // this.

有人知道在backbone.js中呈现视图后会触发哪个事件吗?

据我所知-。源代码中的Render函数为空

渲染的默认实现是无操作

我建议在必要时手动触发它

 constructor: function(){
   Backbone.View.call(this, arguments);     
   var oldRender = this.render
   this.render = function(){
      oldRender.call(this)
      // this.model.trigger('xxxxxxxxx')
   }       
 }
像这样

我遇到了这个似乎很有趣的问题

var myView = Backbone.View.extend({ 

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

    beforeRender: function() { 
       console.log('beforeRender'); 
    }, 

    render: function() { 
        return this; 
    }, 

    afterRender: function() { 
        console.log('afterRender'); 
    } 
});

或者您可以执行以下操作,这就是主干代码的外观(观察者模式,又名pub/sub)。这是一条路:

var myView = Backbone.View.extend({ 
    initialize: function() {  
        this.on('render', this.afterRender);

        this.render();
    },

    render: function () {  
        this.trigger('render');
    },

    afterRender: function () {
    }
});

编辑:
this.on('render','afterRender')将不起作用-因为
主干.Events.on
只接受函数。('event','methodName')上的
魔术是通过主干.View.delegateEvents实现的,因此仅适用于DOM事件。

除了手动添加eventhandler以在初始化时渲染外,还可以将事件添加到视图的“事件”部分。看

e、 g

如果您碰巧正在使用,则木偶会在视图上添加
show
render
事件。有关示例,请参见


另一方面,提线木偶添加了许多您可能感兴趣的其他有用功能。

我意识到这个问题已经很老了,但我想要一个解决方案,允许在每次调用
渲染
后调用相同的自定义函数,因此提出了以下建议

首先,覆盖默认主干
render
函数:

var render = Backbone.View.prototype.render;
Backbone.View.prototype.render = function() {
    this.customRender();
    afterPageRender();
    render();
};
上面的代码在视图上调用
customRender
,然后调用通用自定义函数(
afterPageRender
),然后调用原始主干
render
函数

然后在我的视图中,我将
render
函数的所有实例替换为
customRender

initialize: function() {
    this.listenTo(this.model, 'sync', this.render);
    this.model.fetch();
},

customRender: function() {
    // ... do what you usually do in render()
}

@StefanSchmidt顺便说一句-尝试自己阅读backbone.js源代码。它很可读。是的。。。这就是我在你发帖后发现的。之前我有点害怕。有点像JavaScriptNoob:DYou不需要为此覆盖
构造函数。您还可以手动或使用jquery$.Deferred触发它@cept0@Trip固定的。我不认为这有什么关系,但很明显,仅方法的名称不起作用。我现在必须找出原因。@PHPst:编辑的目的是什么,即更改
render
以显示“?@PHPst:被触发的自定义事件名为
render
,如
此.trigger('render')。您从哪里获得
show
?你有一些文档的链接吗?据我所知,没有称为
show
@PHPst的主干事件。您的编辑完全破坏了我的代码,您可以看到这行
this.trigger('render')?嗯,因为我正在
render
事件(一个自定义事件,不是主干的一部分)上注册
this.afterRender
this.afterRender
将在模板渲染后激发。我不知道你为什么要编辑它,因为我正在还原它。顺便说一句,“show”这个词甚至没有出现在主干带注释的源代码中……在尝试了大量修复之后,这一个对我来说效果最好。谢谢pilauWhy您需要这行:
.bindAll(这是'beforeRender','render','afterRender')?@pilau-请参阅了解u.bind和u.bindAll。它帮助了我,希望它也能帮助你。我知道它的作用,我想问你为什么需要使用它,因为它们(函数)都在扩展视图对象?只是为了帮助澄清:要将自己的函数添加到模型和集合中,你必须使用bindAll。视图不是这样的,它们是自动“绑定”的。@JohnMoses正是我的观点,它们已经是视图对象的一部分。这不起作用。委托事件是指在dom上发生的事件。不是视图对象本身的回调。
events
用于DOM事件的
声明性回调,请参阅
initialize: function() {
    this.listenTo(this.model, 'sync', this.render);
    this.model.fetch();
},

customRender: function() {
    // ... do what you usually do in render()
}