- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在开发一个项目,该项目在后端使用 .NET MVC,在前端使用 Backbone (v1.1) 和 Marionette JS (v1.8.5),我在尝试渲染时遇到了一些性能问题具有 200 个结果或项目 View 的复合 View 。
我第一次遇到 this SO post of a similar issue这帮助我获得了更新版本的 Marionette (v1.8.5)。
Handlebars 模板用于显示一个 html 表格,每个 itemView 都包装在一个 tbody 中(其中有一个更复杂的 Accordion View ,因此使用 tbody 而不是更语义化的 tr)
复合 View 在它的子应用程序初始化时被初始化并显示在 Marionette 区域中。
这是我的代码的简化版本。
Activities 子应用
'use strict';
App.module('Activities', function(){
this.startWithParent = false;
});
App.addRegions({
RegionActivities: '#region-Activities' // <= this lives in .NET View of project
});
App.Activities.addInitializer(function (options) {
var module = this,
activities = new Collections.Activities();
module.activitiesView = new Views.ActivitiesView({
collection: activities
});
App.RegionActivities.show(module.activitiesView);
activities.fetch();
});
事件复合 View
'use strict';
Views.ActivitiesView = Backbone.Marionette.CompositeView.extend({
template: Handlebars.templates['activities/activities'],
itemView: Views.ActivityView,
itemViewContainer: '.admin-table--activities', // <= html table that items are appended to
});
事件项目 View
'use strict';
Views.ActivityView = Backbone.Marionette.ItemView.extend({
template: Handlebars.templates['activities/activity'],
tagName: 'tbody'
});
我读了Marionette Docs on the better performing doc fragment
因此,我遇到的性能问题是所有 200 个项目一次被附加一个,而不是使用 docFragment 缓冲区。通过调试,我相信这是因为在获取之前 View 是用一个空的 Activities 集合实例化的,所以 Marionette 认为我正在更新集合并将 isBuffering 设置为 false。
我也试过像这样在获取成功回调中实例化 activitiesView;
activities.fetch({
success: function(newCollection) {
module.activitiesView = new Views.ActivitiesView({
collection: newCollection
});
App.RegionActivities.show(module.activitiesView);
}
});
这确实将 200 个项目附加到集合 elBuffer(大约需要 4 秒),但是在屏幕上显示任何内容之前又需要 50 秒左右。调试表明,由集合触发的 onShow 方法可能会导致此延迟,因为它逐项循环遍历每个项目。
我错过了什么吗?
我是否在正确的地方做每件事?
我想要实现的目标是否可行?
我觉得这太难了。
谢谢你的时间。汤姆
编辑
这里有复合 View 和项目 View 模板。
事件复合 View 模板
<table class="admin-table admin-table--accordion admin-table--activities">
<colgroup>
<col width="10%">
<col width="22%">
<col width="23%">
<col width="23%">
<col width="22%">
</colgroup>
<thead>
<tr>
<th>Type</th>
<th>Vessel</th>
<th>Activity</th>
<th>Information</th>
<th>Review Status</th>
</tr>
</thead>
</table>
Activity ItemView 模板(每个包裹在 tbody 中)
<tr class="table-title">
<td>Col 1 data</td>
<td>Col 2 data</td>
<td>Col 3 data</td>
<td>Col 4 data</td>
<td Col 5 data</td>
</tr>
<tr class="table-content">
<td colspan="5">More info in here...</td>
</tr>
更新
chrome 开发工具 javascript CPU 配置文件的结果:
Top 3项均指Marionette triggerMethod占用80% CPU。
最佳答案
重置集合时会使用缓冲区,所以你可以试试
activities.fetch({reset: true});
另一种选择是等到获取完成(使用延迟/ promise ),然后再初始化和显示您的 View 。
关于javascript - CompositeView 为大型结果集 Marionette 呈现项目的速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375045/
问题是,每次我通过每个元素上的集合 (MovieCollection) 的获取函数添加新对象时,都会添加某种事件触发器,并初始化一个新的 MovieList 集合在获取所有项目后传递到的对象。 这是我
我正在开发一个基本的调查应用程序来学习 Marionette/很好地掌握嵌套模型(答案 > 问题 > 调查)。我正在使用 backbone-relational 来完成这个。 在调查 View 中,我
我需要向 listView.template 传递一个值,以便了解有关 collection.length 的模板。 我认为一种选择是重新定义 serializeData 方法以便以这种方式传递参数。
我需要向 listView.template 传递一个值,以便了解有关 collection.length 的模板。 我认为一种选择是重新定义 serializeData 方法以便以这种方式传递参数。
简而言之,这就是我所需要的。 我需要显示一个下拉列表/组合框,其中的子项可以来自许多集合。所有这些集合的模型都有一个文本属性,我将在下拉列表中显示该属性。 我想知道是否可以从许多集合中创建下拉列表。
我希望我的合成自动呈现一个集合,它已经这样做了。不过,我也希望它能为我获取一个模型,并为该模型提供复合访问权限。 基本上,我正在尝试使用下面的一组客户呈现用户详细信息。 复合 View define(
我只需要渲染获取的集合的第一个元素。 ItemView = Backbone.Marionette.ItemView.extend({ template: "#item" }); Items
我正在尝试对 Marionette.CompositeView 中的集合进行排序。 我有一个看起来像这样的集合: [ {id: 1, name: 'bar'}, {id: 2, name:
我想用 Backbone.Marionette 创建一个 View 来呈现模型,然后维护 2 个或更多 CollectionView。基本上是一个具有多个 CollectionView 的 Compo
我想从 Marionette.ItemView 访问 app.vent。 也许可以选择将参数 (app.vent) 从 Marionette.CompositeView 传递到 Marionette.
我们必须显示以下 View : 类别(显示为表格),每个类别表格应该有产品(tr)。 我们如何使用 Marionette itemView 和 CompositeView 构建它? 我们需要产品成为一
我处于以下情况。 当 collection.length = 0 我想将一个参数传递给 listTemplate 以便在 listTemplate 中显示一条消息(没有模型存在!)。我怎样才能实现我的
我有一个具有父子关系的模型,我想在表格显示中显示每个父级,然后是子级,我将在其中稍微缩进子级。我已经快到了,但我似乎只能将子项附加到父行,而不是将它们添加到父行之后。 View.TreeView =
实际上,我想更改现有 Marionette CompositeView 中的整个集合,而不为该 View 创建新对象。 我无法找到用于此目的的方法我已阅读文档 here 最佳答案 您应该能够通过使用集
我不知道为什么这段代码不起作用。 阅读documentation , 应该调用 templateHelpers。 我的目标是将 this.collection.length 传递给模板。 有什么提示吗
我想显示集合中的前 100 个条目,或 101 到 200 之间的条目。 如果我创建一个 Marionette CompositeView 并指定 someRegion.show new MyComp
我现在坚持了。我收到以下错误: TypeError: listenTo is undefined return listenTo.call(this, evtSource, events, _.
我正在尝试设置一个简单的 Marionette 的 CompositeView。这就是我最终想要的: %select#target-id %option{:value => "#{@id}"} =
通过使用 jasmine,我正在尝试测试一个返回 Marionette.CompositeView 的 javascript 模块。 这是 javascript 模块 (2) 和 javascript
我想测试一个模块的行为(使用 Marionette )是否有效 (1)。 奇怪的是,js 模块 (1) 有效,但单元测试 (2) 使用 Jasmine失败。 有什么想法吗? (1) /*global
我是一名优秀的程序员,十分优秀!