我试图让{{#each}}
帮助器迭代一个对象,就像在vanilla handlebar中一样。不幸的是,如果我在一个对象上使用#each,Ember.js版本会给我这个错误:Assertion failed: The value that #each loops over must be an Array. You passed [object Object]
个
我写这个助手试图补救这一点:
Ember.Handlebars.helper('every', function (context, options) {
var oArray = [];
for (var k in context) {
oArray.push({
key : k,
value : context[k]
})
}
return Ember.Handlebars.helpers.each(oArray, options);
});
现在,当我尝试使用{{#every}}
时,我得到以下错误:Assertion failed: registerBoundHelper-generated helpers do not support use with Handlebars blocks.
这似乎是一个基本的功能,我知道我可能错过了一些明显的东西。有人能帮助吗?
编辑:
这里有一把小提琴:http://jsfiddle.net/CbV8X/
3条答案
按热度按时间cgyqldqp1#
使用
{{each-in}}
助手。您可以像{{each}}
助手一样使用它。示例:
JS Bin demo.
sqougxex2#
在摆弄了几个小时之后,我想出了这个古怪的办法:
我不知道
this.set
有什么影响,但这似乎是工作!这里有一把小提琴:http://jsfiddle.net/CbV8X/1/
omtl5h9j3#
我一直在寻找类似的功能,既然我们分享了我们的黑客方式,这里是我的小提琴为不耐烦:http://jsfiddle.net/L6axcob8/1/
这个小提琴是基于@lxe提供的一个,由@Kingpin2k更新,然后是我自己。
Ember:1.9.1,车把:2.0.0版,jQuery 2.1.3版
这里我们添加了一个名为
every
的助手,它可以迭代对象和数组。例如此模型:
可以使用以下把手模板进行迭代:
every
helper的工作原理是从对象的键创建一个数组,然后通过ArrayController协调对Ember的更改。是的,很有技巧。不过,这确实可以,让我们在对象中添加/删除属性,前提是该对象支持观察[]属性。在我的用例中,我有一个Ember.Object派生类,当属性被添加/删除时,它会通知[]。我建议看看Ember.Set的这个功能,尽管我看到Set最近被弃用了。因为这稍微超出了这个问题的范围,我将把它留给读者作为练习。这里有一个提示:设置未知属性
为了得到属性更改的通知,我们将非对象值 Package 在一个我称为 DataValueObserver 的东西中,这个东西建立了(目前是单向的)绑定,这些绑定在我们内部的ArrayController所保存的值和我们正在观察的对象之间提供了一个桥梁。
处理对象时;我们把它们 Package 在ObjectProxy中,这样我们就可以引入一个'key'成员而不需要修改对象本身。为什么是的,这确实意味着你可以递归地使用#every。这是给读者的另一个练习;- )
我建议你的模型基于Ember.Object,这样可以和Ember的其他部分保持一致,允许你通过get和set处理程序来操作你的模型。或者,就像在小提琴上演示的那样,你可以使用Em.Get/Em.set来访问模型,只要你这样做是一致的。如果你直接接触你的模型(没有get/set),那么
every
不会得到你的改变的通知。为了完整起见,下面是我的
every
助手:灵感来源:
如果你错过了,这把小提琴又来了: