0

在 Ember.js 我有这个模型:

App.Product = DS.Model.extend({
    name: DS.attr("string"),
    ean: DS.attr("number"),
    price: DS.attr("number"),
    units: DS.attr("number"),
    product_states: DS.hasMany('App.ProductState')
});

App.ProductState = DS.Model.extend({
    price: DS.attr("number"),
    units: DS.attr("number"),
    product_id: DS.belongsTo('App.Product'),
    user_id: DS.belongsTo('App.User'),
    created: DS.attr("date")
});

我每个都有这个:

        {{#if view.product}}
            {{#each item in App.ProductState.find({ product_id: view.product.id})}}
                <tr>
                    <td>{{view.product.name}}</td>
                    <td>{{item.price}}</td>
                    <td>{{item.units}}</td>
                    <td>{{item.created}}</td>
                </tr>
            {{/each}}
        {{/if}}

这给了我这个错误(Chrome):

Uncaught Error: Parse error on line 6:
...in App.ProductState.find({ product_id: v
-----------------------^
Expecting 'ID', got 'INVALID' 

加载页面时出现此错误。在加载时 view.product 设置为 NULL。each 位于 jQuery UI 对话框中,其内容是通过按钮动态设置的view.set("product",product);

设置产品对象是有效的,因为当我只想在对话窗口中打印出产品变量时,它工作得很好,但是当我使用 each 时它会崩溃。

在我看来,Ember 忽略了 if 条件并尝试遍历每个给出错误的循环。另一种选择是我只是错误地使用了 find 方法(顺便说一句。Ember 指南告诉你如何设置模型关系,但据我所知并没有提到它们有什么效果以及如何正确使用它们)。

是否有可能解决这个问题?也许像在javascript函数中运行每个而不是模板之类的东西?

4

1 回答 1

2

您不能将 javascript 放入车把模板(视图)中。如果您需要直接使用 javascript 代码进行一些特殊的演示处理,那么您应该使用此处介绍的车把助手:http: //emberjs.com/guides/templates/writing-helpers/

在您的具体示例中,因为product_states它是您的一个属性,Product您可以直接访问该product_states属性,并且 ember / ember 数据将在您请求数据时加载数据,然后在数据从服务器返回时更新。

{{#if view.product}}
    {{#each item product.product_states)}}
        <tr>
            <td>{{view.product.name}}</td>
            <td>{{item.price}}</td>
            <td>{{item.units}}</td>
            <td>{{item.created}}</td>
        </tr>
    {{/each}}
{{/if}}

请注意 ember 中的约定是具有属性 camelCased。所以你的Product模型应该有一个productStates属性,你的ProdcutState模型应该有一个userId属性`。不确定这是否会弄乱您的 json 从服务器的具体化。

希望这可以帮助。

于 2013-05-27T13:06:39.020 回答