EmberJS / HandlebarsJS的自定义for循环助手

时间:2012-04-25 00:10:54

标签: javascript ember.js handlebars.js

两个小时前,我开始:Nested HandlebarsJS #each helpers with EmberJS not working

在我自己想出一个可接受的临时解决方案后不久,问题仍未解决。我的问题并没有止步于此。

我现在正在尝试创建一个自定义帮助程序,它将遍历一个对象数组,但排除第一个索引 - 几乎是:for(i = 1; i < length; i++) {}。我已经在网站上阅读了你需要获取上下文的长度并将其传递给选项 - 考虑到你的功能如下:forLoop(context, options)

但是,context是一个字符串而不是一个实际的对象。执行.length时,您将获得字符串的长度,而不是数组的大小。当我把它传递给选项时,没有任何反应 - 不要太提及浏览器冻结。

然后我先将getPath尝试传递给选项,然后返回一个空字符串。

我应该做些什么呢,我之前只为HandlebarsJS制作了for循环代码并且有效,但是EmberJS似乎没有接受它,为什么?

编辑:我几乎也跟着:http://handlebarsjs.com/block_helpers.html - &gt;简单的迭代器

2 个答案:

答案 0 :(得分:1)

我在尝试了很长时间后自己解决了这个问题。

HandlebarsJS方法(如网站上所述)不再对EmberJS有效,现在如下:

function forLoop(context, options) {
    var object = Ember.getPath(options.contexts[0], context);
    var startIndex = options.hash.start || 0;

    for(i = startIndex; i < object.length; i++) {
        options(object[i]);
    }
}

哎呀,你甚至可以扩展for循环以包含索引值!

function forLoop(context, options) {
    var object = Ember.getPath(options.contexts[0], context);
    var startIndex = options.hash.start || 0;

    for(i = startIndex; i < object.length; i++) {
        object[i].index = i;

        options(object[i]);
    }
}

这是一个带有变量起始索引的for循环。您可以在模板中使用它,如下所示:

{{#for anArray start=1}}
    <p>Item #{{unbound index}}</p>
{{/for}}

答案 1 :(得分:0)

我是这样做的(它有效!!!)

首先, 我在我的模型中有一个'预览'属性/函数,它只返回一个数组中的arrayController:

objectToLoop = Ember.Object.extend({ 
        ...
    arrayController: [],
    preview: function() {
        return this.get('arrayController').toArray();
    }.property('arrayController.@each'),
        ...
});

然后,我添加了一个新的Handlebars助手:

Handlebars.registerHelper("for", function forLoop(arrayToLoop, options) {
    var data = Ember.Handlebars.get(this, arrayToLoop, options.fn);

    if (data.length == 0) {
        return 'Chargement...';
    }

    filtered = data.slice(options.hash.start || 0, options.hash.end || data.length);

    var ret = "";
    for(var i=0; i< filtered.length; i++) {
        ret = ret + options.fn(filtered[i]);
    }
    return ret;     
});

感谢所有这些魔力,我可以在我的观点中称之为:

<script type="text/x-handlebars"> 
    <ul>
        {{#bind objectToLoop.preview}}
            {{#for this end=4}}
                <li>{{{someProperty}}}</li>
            {{/for}}
        {{/bind}}
    </ul>
</script>

就是这样。

我知道这不是最优的,所以无论谁知道如何改进它,请告诉我:)