- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
自从发现 Ractivejs 以来,我正在慢慢地将我的应用程序转移到它上面。
之前,我使用 vanilla JavaScript 构建了一个 html 树结构来创建元素,然后在完成后将其附加到页面。我最近将它移到了 Ractivejs,它在小型树结构上工作得很好,但如果它涉及深度嵌套的对象,它会超出调用堆栈。
有没有一种方法可以将我在 JavaScript 中构建的元素附加到 Ractivejs 模板并在其上保留 Ractivejs 事件,或者有没有一种方法可以递归循环大对象而不超出调用堆栈?
例子
var tree = {
'childPages' : [{
'name': 'first child',
'childPages': []
}, {
'name': 'second child',
'childPages': [{
'name': 'second first sub child',
'childPages': []
}]
}, {
'name': 'third child',
'childPages': [{
'name': 'third first sub child',
'childPages': [{
'name': 'sub sub child',
'childPages': []
}]
}]
}]
};
function buildTree (tree) {
var ul = document.createElement('ul');;
for(var i =0; i < tree.childPages.length; i++){
var li = document.createElement('li');
li.innerText = tree.childPages[i].name;
ul.appendChild(li);
if (tree.childPages[i].childPages.length) {
li.appendChild (buildTree(tree.childPages[i]));
}
}
return ul;
}
document.body.appendChild(buildTree(tree));
var ractive = new Ractive({
el : 'body',
template: '#treeNode',
data: {
'childPages' : [{
'name': 'first child',
'childPages': []
}, {
'name': 'second child',
'childPages': [{
'name': 'second first sub child',
'childPages': []
}, {
'name': 'second second sub child',
'childPages': []
}]
}, {
'name': 'third child',
'childPages': [{
'name': 'third first sub child',
'childPages': [{
'name': 'sub sub child',
'childPages': []
}]
}]
}]
}
});
<script src="http://cdn.ractivejs.org/latest/ractive.js"></script>
<script id="treeNode" type="text/ractive">
<ul>
{{#each childPages}}
<li>
{{name}}
{{#if childPages}}
{{> treeNode}}
{{/if}}
</li>
{{/each}}
</ul>
</script>
最佳答案
通常,当您超出调用堆栈时,这是因为 Ractive 处理缺失数据属性的方式 - 如果您有 {{with foo}}{{bar}}{{/with}}
和 foo.bar
不存在,{{bar}}
引用未解析,因此它“进入上下文堆栈”,并查找 bar
代替。
大多数时候这真的很方便,但在这种情况下可能会有问题,因为如果树中的项目没有 childPages
属性,Ractive 将进入堆栈给父级——它把我们送进了无限递归的兔子洞。
有两种解决方法:
childPages
属性,即使它是一个空数组,或者...this.childPages
而不是仅使用 childPages
(或 ./childPages
- 它是等效的,您可能对其中一个有审美偏好other) 那么 Ractive 将不会在当前上下文之外寻找数据。这是一个例子,删除了所有空的 childPages
数组 - 没有 this.
,我们立即超出了调用堆栈,但因为它在那里我们是完全安全的。 var ractive = new Ractive({
el : 'body',
template: '#treeNode',
data: {
'childPages' : [{
'name': 'first child'
}, {
'name': 'second child',
'childPages': [{
'name': 'second first sub child'
}, {
'name': 'second second sub child'
}]
}, {
'name': 'third child',
'childPages': [{
'name': 'third first sub child',
'childPages': [{
'name': 'sub sub child'
}]
}]
}]
}
});
<script src="http://cdn.ractivejs.org/latest/ractive.js"></script>
<script id="treeNode" type="text/ractive">
<ul>
{{#each this.childPages}}
<li>
{{name}}
{{#if this.childPages}}
{{> treeNode}}
{{/if}}
</li>
{{/each}}
</ul>
</script>
关于javascript - Ractivejs 中的递归部分超出调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30166473/
我正在使用 Ractive.JS 绑定(bind): var alertsBinding = new Ractive({ el: '.alerts', template: alerts
事件模板 单击 div 时,会显示更多详细信息,但有点不确定如何通过单击图标关闭 div 来关闭 div.more。 尝试通过教程来寻找答案,但找不到。我想通过使用与 JQuery 类似的方式,
如果我的 Ractive 模板中有以下内容: click me 然后我可以用这个来监听点击: app.on({ handleClick:function() { alert("
自从发现 Ractivejs 以来,我正在慢慢地将我的应用程序转移到它上面。 之前,我使用 vanilla JavaScript 构建了一个 html 树结构来创建元素,然后在完成后将其附加到页面。我
我在使用 Ractive 动态添加子组件时遇到了一些问题。 我正在制作一个时间表/日历组件,并通过选择一天的时间间隔来添加新的事件/ session 。这就是为什么我需要动态添加子组件。 现在我做这样
我正在尝试使用代理事件(on-mousedown、up、move、out)通过 RactiveJS 实现一个简单的可拖动 DIV 正在关注 JSFiddle工作正常,但是当用户移动鼠标太快时拖动停止。
我做错了什么吗? 我的模板 {{#formData.municipalities}} {{name}} {{/formData.municipalit
http://examples.ractivejs.org/comments 上面的例子中有一行: // fire an event, so we can (for example) // save
我知道在普通 JS 中你可以使用删除命令来删除对象,但我在文档中找不到任何用于对象操作的内容。 例如,我如何在ractivejs中删除这个对象? template.set('object', {hel
也许这是一个基本的 javascript 问题,而不是特定于 Ractivejs 的问题。 我如何向 Ractive 组件添加共享行为...例如,如果多个组件都有一个 strip_whitspace(
RactiveJS 与 JSX 兼容吗? 我猜有些标记不兼容。我喜欢强类型的想法,并且能够在 JavaScript 源代码中干净地编写模板。也许这被认为是糟糕的设计? 最佳答案 没有。 React.j
我一直在研究许多双向数据绑定(bind)库,但到目前为止还没有找到一个可以在根据模型更改设置输入值时触发 onchange 事件的库。有没有办法用 ractive.js 做到这一点? 最佳答案 这是可
基本上我想要这个:In Mustache templating is there an elegant way of expressing a comma separated list without
我发现自己处于一种情况,我想从父 Ractive 访问从 Ractive 组件创建的实例。 例如。 var myComponent = Ractive.extend( { us
我正在尝试将一个 active 类名添加到被点击的 li 中。显示它已被选中。 我的模板: var legCatagoryTemplate = "{{#legs:i}}{{name}}W: {{wi
有什么方法可以使用参数运行计算属性吗?几乎是一个计算函数。 JS代码 computed: { IsShapeToolSelected: function (toolId) {
我有一个在单击元素时调用的函数,我正在比较两个数组。第一个数组使用过滤数组的表达式打印到 DOM。 Handlebars : {{#each search(~/budgets, searchValue
我试图让 HTML 有条件地出现在 ractive 模板中,但没有成功。 正如您在此 JSFiddle 中看到的那样结果与预期不同 - 表是单行。 我的模板: {{#list:nu
我在 RactiveJS 中使用 Pikaday 日期选择器作为装饰器,想在装饰器之外访问日期选择器的 api,但将其添加到返回对象似乎不起作用。请有人指出我正确的方向。 http://jsbin.c
我有一个页面显示来自带有 Ractive.js 的 json 的时间相关文本片段。初始化后,我想每分钟检查一次,存储在 json 中的停止时间是否到期。然后应该隐藏文本片段。 我尝试过的事情: {{#
我是一名优秀的程序员,十分优秀!