gpt4 book ai didi

javascript - 带有 subview 的 Backbone.Marionette View

转载 作者:行者123 更新时间:2023-11-30 13:00:35 25 4
gpt4 key购买 nike

在 Backbone.Marionete 环境中设置 View 以拥有 subview 列表、无需手动渲染它们并尽可能少地消耗内存的适当方法是什么。

带有 subview 的 View 是基于模板呈现的,并且是选项卡控件选项卡的一部分。选项卡 View 的模板有 div,用作子控件的占位符(两个 Collection View 和两个辅助控件)

我已经做了几个方法:

1) 在 render 方法中创建 View 实例,并将它们附加到 propper el 硬编码 render 方法中的选择器。

2) 扩展 Marionette 布局并为每个 View 声明一个区域。

var GoalsView = Marionette.Layout.extend({

template: '#goals-view-template',

regions: {
content: '#team-goals-content',
homeFilter: '#team-goals-home-filter',
awayFilter: '#team-goals-away-filter'
},

className: 'team-goals',

initialize: function () {

this.homeFilterView = new SwitchControlView({
left: { name: 'HOME', key: 'home' },
right: { name: 'ALL', key: 'all' },
});

this.awayFilterView = new SwitchControlView({
left: { name: 'AWAY', key: 'away' },
right: { name: 'ALL', key: 'all' },
});

this.сontentView = new GoalsCollecitonView({
collection: statsHandler.getGoalsPerTeam()
});
},

onShow: function () {
this.content.show(this.сontentView);
this.homeFilter.show(this.homeFilterView);
this.awayFilter.show(this.awayFilterView);
}
});

这是很酷的方法,但我担心维护始终显示单个 View 的区域集合的开销。

3) 我使用以下逻辑扩展了 Marionette 项目 View :

var ControlsView = Marionette.ItemView.extend({
views: {},

onRender: function() {

this.bindUIElements();

for (var key in this.ui) {
var view = this.views[key];
if (view) {

var rendered = view.render().$el;

//if (rendered.is('div') && !rendered.attr('class') && !rendered.attr('id')) {
// rendered = rendered.children();
//}

this.ui[key].html(rendered);
}
}
}
});

这让我可以编写以下代码

var AssistsView = ControlsView.extend({

template: '#assists-view-template',
className: 'team-assists',

ui: {
content: '#team-assists-content',
homeFilter: '#team-assists-home-filter',
awayFilter: '#team-assists-away-filter'
},

initialize: function () {
this.views = {};

this.views.homeFilter = new SwitchControlView({
left: { name: 'HOME', key: 'home' },
right: { name: 'ALL', key: 'all' },
});

this.views.awayFilter = new SwitchControlView({
left: { name: 'AWAY', key: 'away' },
right: { name: 'ALL', key: 'all' },
});

this.views.content = new AssistsCollecitonView({
collection: statsHandler.getAssistsPerTeam()
});
}
});

但它肯定会泄漏内存,而且我觉得我无法编写适当的代码来处理内存泄漏。

所以总的来说,我想要的是有一个很好的声明方式来创建一个 View ,其他 View 作为它的控件,防止内存泄漏和尽可能少的内存消耗......

附言对不起文字墙

最佳答案

为什么不简单地使用布局并在布局区域内显示 View ?您可以在此处查看示例:https://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/apps/contacts/list/list_controller.js#L43-L46

关于javascript - 带有 subview 的 Backbone.Marionette View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17489773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com