- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了与 Blaze 重画相关的严重性能问题。我知道我的数据结构有问题,但我找不到修复它的方法。这有点长:我会尽力把它讲清楚。
目标/问题
我想创建一个计划 View ,用户可以在其中安排测试。用户应该能够拖放测试槽,但由此产生的重绘速度太慢,以至于无法正常工作。
数据
我有一个 Sittings
集合,其中存储有关测试时间的详细信息。每次考试都有一个 scheduleGroups
列表(即,考试 1 和考试 2 在星期二进行,考试 3 和考试 4 在星期三进行)结构看起来或多或少像这样:
var sitting = {
"_id" : "sittingId",
"name" : "Amazing Sitting",
"locationIds" : [
"room1_id",
"room2_id"
],
"startDate" : ISODate("2015-07-01T04:00:00Z"),
"endDate" : ISODate("2015-07-02T04:00:00Z"),
"scheduleGroups" : [
{
"_id" : "dEb3mC7H8RukAgPG3",
"name" : "New group",
"booths" : [
{
"boothNumber" : 1,
"slots" : [
{
"examId" : "exam1",
"dayNumber" : 1,
"startTime" : {
"hour" : 8,
"minutes" : 0
},
"endTime" : {
"hour" : 9,
"minutes" : 30
},
"candidateId" : "odubbD42kHDcR8Egc",
"examinerIds" : [
"GQmvyXbcmMckeNKmB",
"GfoBy4BeQHFYNyowG"
]
}
]
}
]
"locationId" : "room1_id"
}],
"examIds" : [
"exam1",
"exam2",
"exam3"
]
};
HTML
Sitting 在 Router.current().data
Hook 中定义为全局上下文。这是重绘问题的一部分。不管怎样,下面的 HTML 会产生下面的布局(下面的图片)。
<template name='scheduler'>
<div class='container'>
<div class='tabpanel'>
<div class='tab-content' id='scheduler-content'>
{{#each getScheduleGroups}}
<div class='container-fluid schedule-wrapper'>
<div class='row'>
<div class='scheduler-inner-box placeholder-box'></div>
{{#each booths}}
<div class='group-column-head scheduler-inner-box'>{{boothNumber}}</div>
{{/each}}
</div>
<!-- Sittings can take place over several days, normally 2 days -->
{{#each sittingDays}}
<div class='day-wrapper'>
<h3 class='text-center'>Day {{this}}</h3>
<!-- This helper returns a list of start times: [June 1 9AM, June 1 915AM....] -->
{{#each getScheduleTimes ..}}
<div class='row time-row'>
<div class='group-row-head scheduler-inner-box'>
<span class='box-content'>{{this}}</span>
</div>
<!-- Loop through each booth, so that each slot has a square for that boot
i.e. June 1 9AM has space for booth 1, and booth 2, and booth 3, etc
-->
{{#each ../../booths}}
<!-- Paper starting now tells us if there is a slot scheduled to begin at this time or wher its empty-->
<div class='scheduler-inner-box {{#unless paperStartingNow ../.. ..}}open-booth{{/unless}}'>
{{#with paperStartingNow ../.. .. boothNumber}}
<!--
getSlotStyle calculates height and colour, depending on how long the paper is and whether
it's ready to go: i.e. does it have a candidate and the right number of examiners?
-->
<div class='paper-tile tile' {{getSlotStyle this ../boothNumber 'paper'}}>
<span class='slot-name'>{{getSlotName}}</span>
</div>
{{#if slotHasCandidate}}
<div class='candidate-tile tile' {{getSlotStyle this ../boothNumber 'candidate'}}>
<span class='slot-name candidate-name'>{{getCandidateDisplay}}</span>
</div>
{{/if}}
{{#each slotExaminers}}
<div class='examiner-tile tile' {{getSlotStyle .. ../../boothNumber 'examiner' index}}>
<span class='slot-name examiner-name'>{{profile.name}}</span>
</div>
{{/each}}
{{/with}}
</div>
{{/each}}
</div>
{{/each}}
</div>
{{/each}}
</div>
{{/each}}
</div>
</div>
</div>
问题当用户将插槽(紫色图 block )放到空白处,或者将考生或考官拖动到另一个图 block 时,我会更新集合并让 Meteor 重新绘制。然而,整个事情重新绘制,我找不到隔离的方法。
这是移动整个位置、考生、考官和所有内容的代码。
moveSlot: function (originalBoothNumber, originalSlot, dropBoothNumber, newSlot) {
check( originalBoothNumber, Number );
check( originalSlot, Object );
check( dropBoothNumber, Number );
check( newSlot, Object );
//pull the old slot
var originalBooth = _.findWhere( this.booths, {boothNumber: originalBoothNumber} );
originalBooth.slots = _.without( originalBooth.slots, originalSlot );
//insert the new one
var dropBooth = _.findWhere( this.booths, {boothNumber: dropBoothNumber} );
dropBooth.slots.push( newSlot );
var modifier = {
$set: {}
};
modifier["$set"]["scheduleGroups." + this.getIndex() + ".booths"] = this.booths;
return Sittings.update({_id: this.getSitting()._id }, modifier);
},
我需要改变存储 Sitting.booths
的方式吗?如果有人可以推荐一个更好的数据结构来触发插槽的重绘,我'真的很感激。我发现了一种技巧,可以将每个槽放入 session 变量中,但必须有另一种方法。
感谢您的耐心和帮助,分贝
最佳答案
问题
这是因为您将整套slots
存储在booth
的一个文档中。一旦您更新插槽
,整个文档就会被视为更新。
解决方案
恕我直言,我认为您不需要更改结构,除非您已经构建了一个功能来搜索slot
或booth
。您可以通过创建一系列 reactiveVariable
或 reactiveDictionary
来设置它,您的模板应该仅依赖于该 react 变量。每次更新时,请考虑手动或自动在其中两个之间同步。
PS。我没有与此网站建立任何附属关系:https://www.sportsplus.me 。但如果你注册 -> 主页 -> MLB -> 任何比赛 -> 点击加号,你可以看到他们的杰作无限滚动,部分重画。 (打开您的开发控制台并观察元素的变化)。它们所做的事情与您尝试使用最少重画所做的事情完全相同。
关于javascript - meteor /火焰 : updating list properties with minimal redraw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31396582/
我有一个带有 events.load 函数的图表,该函数根据图表属性绘制一些线条。 加载功能完全按照我的意愿工作,但我想在每次重新绘制图表时删除并重新绘制线条(例如隐藏系列)。 我在 chart.ev
我有一个基本的 UWP 应用程序,其中嵌入了 WebView,可呈现相当大的 HTML 文档(最多 500 个信纸大小的打印页面)。 我想添加对打印该 HTML 文档的支持。这是我的方法: 为了支持分
每次我选择一个 m 适配器时,我都想重新绘制我的图表,第一次绘制的图表看起来很完美,但是当我选择一个并返回时,看起来它绘制了两次相同的图表。 这是我的源代码: public class MainA
您好,我有一个下拉菜单,每当我更改下拉菜单中的选项时,我想更改 Canvas 中的内容...例如 var paper = Raphael("myDivID",400,400); function sm
我已经编写了一个带有 NSview 和按钮的窗口。当程序启动时,窗口中会出现一个点。按下按钮后,应该会出现另外三个点,但代码不会重绘窗口。如果我在绘图函数内设置断点,我发现代码仅在绘图函数中第一次停止
我正在尝试将属性更改为自定义 LinearLayout 类,我将选项设置为类: MyBuilder option = new MyBuilder.Builder() .image(...) .setC
我正在为我的应用程序使用一些矢量图形 (.png)。在 photoshop 中,我可以放大并始终看到简单几何形状(如圆形)的完美清晰边界。但是,在我的 iPhone 上,我的相同图形看起来参差不齐且粗
我是 cocoa 新手。我以为我可以将 UITableViewCell 背景 View 设置为我自己的自定义子类,以便在单元格的背景中显示加载栏,但当我想更新该栏时,调用 setNeedsDispla
CoreData 返回 BOOL 值,根据该值我在 UITableViewCell accessoryView 上绘制了一个 UILabel。问题是 UILabel 也在它根本不应该出现的单元格上重复
我正在编写一个从 HealthKit 获取步数数据并在屏幕上显示统计数据的应用程序。我有一个带有委托(delegate)协议(protocol)功能的 viewcontoller: func user
我目前正在使用新版本的 OpenLayers OL3 升级 OpenLayers 客户端版本 2.13.1。我的设置包括作为 WMS map 服务器的 Mapserver 和前面提到的 OpenLay
我正在使用 morris.js 图表和 Bootstrap slider 。 我想做什么: 如果移动了 slider ,我想在图表中 slider 值的位置插入一条事件线。没什么特别的。 问题: 设置
本文整理了Java中gov.nasa.worldwind.WorldWindow.redraw()方法的一些代码示例,展示了WorldWindow.redraw()的具体用法。这些代码示例主要来源于G
我正在使用 Highcharts 3.0.2 我有一个 div#chart 和两个 js 变量,var options1 = {...}, options2 = {...}。它们包含不同的 highc
我正在使用 Highcharts,我想在用户点击图表标签时触发一些事件。只要我不重绘,它就可以正常工作。当我使用 chart.redraw() 时,不再触发点击事件这是一个 fiddle :https
我有一个带有图片框的表单,它显示图片和在图片框的 Paint 事件处理程序中绘制的一些叠加层。叠加层根据鼠标移动更新自身(基本上改变叠加层不同部分的不透明度)。 目前,我正在从鼠标移动处理程序调用 p
我正在使用基于 View 的 NSTableView,它使用其中包含多个控件的自定义单元格 View 。其中一个控件是纯图像 NSButton,它要么显示复选标记图像,要么根本不显示图像。此外,当我将
我正在制作条形图。它显示了各州的流感疫苗接种率。通过单击图例,您可以在每个州的人口统计之间切换,太棒了! 但是,需要双击图例才能重绘。单击一次即可成功消除条形,但需要第二次单击才能重新绘制它们。 工作
我有一个向导(org.apache.wicket.extensions.wizard.Wizard),它有一个AjaxButton作为其下一个按钮。 我正在对下一个按钮的 onSubmit() 方法执
我是 angularjs 新手,正在尝试创建我的第一个指令。我正在创建一个指令来将 Charts.js2.0(beta) 加载到我的应用程序中。 我有 2 个由 Angular-route 管理的 V
我是一名优秀的程序员,十分优秀!