我的应用程序中有两个视图,第一个视图是一个模式对话框,第二个视图是最初触发模式的位置。关闭模式后,我使用触发器事件函数在第二个视图中触发了一个函数。第二个视图中的函数被触发,但是它会重新渲染整个第二个视图两次。我读过有关僵尸视图的文章,并确保解除绑定并删除模式视图,以防它导致重复的事件,但这不起作用。
下面是我的模式视图类:
var BaseModalView = base.views.View.extend({
tpl: templates.get('modalTmp'),
className: 'modal-view',
events: {
'evt:show': 'show',
'evt:hide': 'hide',
'click [data-action=resume-push-market]': 'proceed',
},
initialize: function(options) {
this.options = options;
_.bindAll(this, 'render', 'show', 'hide', 'remove');
this.render();
},
render: function() {
this.$el.html(this.tpl(this.options));
this.$el.appendTo('body');
this.$modal = this.$('.modal');
this.$modal.on('hidden.bs.modal', _.bind(function() {
this.close();
}, this));
},
show: function() {
this.$modal.modal('show');
},
hide: function() {
this.$modal.modal('hide');
},
proceed: function() {
e.preventDefault();
e.stopPropagation();
this.hide();
this.vent.trigger('resume', true);
},
close: function() {
//unbind events
this.unbind();
//Remove html from page
this.remove();
},
});
export default BaseModalView;
下面是我在第二个视图上侦听触发器的方式:
this.listenTo(this.vent,'resume', this.resume);经过一些调试之后,我注意到只有在函数被触发后,第二个视图被呈现两次之后,模式视图才会被解除绑定并被移除。我不确定这是否是正常行为,因为我是Backbone.js的新手。任何帮助都将不胜感激。
更新:我想我已经缩小了是什么导致了额外的渲染。第二个视图是集合中的一个项目,因此如果该集合只有一个项目,即一个视图,那么当我的函数从模式触发时,它将重新呈现该视图一次。但是,如果集合中有多个视图,则在触发函数时将重新呈现每个视图。我已经在集合中的每个项目中初始化了模式视图,所以从技术上讲,它应该只重新呈现集合中的一个项目(视图),但它每次都会重新呈现它们。再次不确定我是否正确低估了主干事件序列,如果有人遇到类似的问题,请让我知道
发布于 2020-03-02 03:30:55
我找到了一种绕过这个问题的方法,通过将原始视图模型选项传递到模式视图中,一旦函数被触发并且视图被重新渲染,我就可以通过比较视图ID来确保只有产生模式的视图才会使用预期的信息进行更新。我敢肯定这是一种非常糟糕的方式。
https://stackoverflow.com/questions/60470295
复制相似问题