javascript - Ractive.js 中的多维数组

标签 javascript view multidimensional-array ractivejs

我一直在使用神奇的 Ractive.js 库(不要与 Facebook 的 Reactive.js 混淆)。我发现您可以使用以下模板代码渲染二维:

<div class="container">
{{ #frameContainer:i }}
    <div class="row">
    {{ #frameContainer[i] }}
        <div on-click="cell-click" class="cell {{ . ? 'on' : 'off' }}"></div>
    {{ /frameContainer[] }}
    </div>
{{ /frameContainer }}
</div>

这完全按照我的预期工作,内部cell-click事件返回正确的键路径(例如frameContainer.2.4)。

然后我想把它变成一个三维数组(添加一个“时间”轴)。但是,以下方法不起作用:

<div class="container">
{{ #frameContainer[time]:i }}
    <div class="row">
    {{ #frameContainer[time][i] }}
        <div on-click="cell-click" class="cell {{ . ? 'on' : 'off' }}"></div>
    {{ /frameContainer[][] }}
    </div>
{{ /frameContainer }}
</div>

其中 time 表示当前时间值(它一次只会显示一个“时间” - 当您这样说时,这似乎很明显......)。

这......有点作品。它按应有的方式显示网格,但 cell-click 事件返回的键路径不再正确,返回类似 ${frameContainer-time-8-}.2 - 它丢失了时间值(并且变得有点奇怪)。

显然,我可以通过使用一个 currentFrame 值来渲染并使用 ractive.set() 进行切换,但这似乎不太优雅。有没有办法纯粹在模板内完成它?如果没有,最有效的方法是什么?

谢谢!

最佳答案

这是一个相当棘手的问题。基本上,${frameContainer-time-8-} keypath 是 Ractive 唯一标识 expression 的方式,和${frameContainer-time-8-}.2表示“该表达式计算结果的第三个成员”。

这里发生的事情是这样的:当 Ractive 的解析器看到 {{ #frameContainer[time][i] }} 时部分,它解析 frameContainer[time][i]作为 JavaScript 表达式并将其转换为以下内容(您可以自己尝试 - Ractive.parse('{{#frameContainer[time][i]}}') ):

{
  r: ['i','time','frameContainer'],
  s: '${2}[${1}][${0}]'
}

渲染模板时,Ractive 会为该表达式创建一个评估器,该评估器具有从字符串(s 属性)生成的函数,并监视 timeframeContainer值(它不需要监视 i 因为它无法更改)。当这些值中的一个或两个发生更改时,函数将以它们作为参数执行。如果它返回更改的值,Ractive 需要更新 View 。

由于有一个很好的机制可以将 View 模型更改传播到 View - 键路径 - 这就是评估器使用的机制。为此,它需要创建一个唯一的键路径,因此 ${frameContainer-time-8-} (它不能包含点或方括号,因为 Ractive 会尝试在这些点或方括号上进行拆分)。

所以事情是这样的:表达式键路径是单向的。你不能这样做ractive.set('${frameContainer-time-8-}.2', 'true')就像使用常规键路径一样,因为 Ractive 无法找出对应的底层属性(或者即使有一个 - 它可能是它所知道的所有导数)。

解决方案1

最简单的解决方法可能是执行以下操作:

<div on-click="cell-click:{{time}},{{i}}" class="cell {{ . ? 'on' : 'off' }}"></div>

然后您可以使用 timei您的 cell-click 中的值处理程序(它们将是 event 之后的第二个和第三个参数)。

我在这里做了一个简化的演示(假设我理解正确):http://jsfiddle.net/rich_harris/LYEGX/

解决方案2

另一种方法是完全取消键路径并使用适配器。我不会在这里详细介绍所有细节,因为它可能不是您正在寻找的答案,但有一些 documentation和一个example (有些链接目前已过时,抱歉......)。简而言之,此方法假设您能够在应用中使用非 POJO。

关于javascript - Ractive.js 中的多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21411509/

相关文章:

python - 多处理 : NULL result without error in PyObject_Call

函数内的javascript函数不起作用?

java - 如何刷新 recyclerview 的上一个项目行 View 的 View

mysql - MySQL 数据库中的 TABLE 和 VIEW 有什么区别?

android - setClickable() 不适用于按钮

javascript - 如何将三维数组分割为三个 for in 循环?

javascript - jquery div 不响应其他 javascript/jquery 方法

javascript - vue.js cli 命令 "npm run serve"是如何工作的

javascript - 突出显示ace中的单个字符

php - 如何按点对这个多维数组进行排序?