【问题标题】:Ember Model empty until enter RouteEmber 模型为空,直到进入 Route
【发布时间】:2014-04-25 15:28:14
【问题描述】:

我有一个带有以下模型的 Ember 应用:

  • 食物
  • 用餐

(还有其他模型,但为简洁起见省略)。

路由器是这样配置的:

this.resource('food', { path: '/food/:food_id' });

this.resource('meals',function() {
  this.resource('meal', { path: '/:meal_id'}, function() {
    this.route('edit');
  });

  this.route('new');
});

在我的食物模板中,我需要访问膳食列表才能打印它们。最初我认为FoodController 上的needs 属性可以解决问题。

App.FoodController = Ember.ObjectController.extend({
    needs: ['meals', 'mealsIndex'],
    ...
});

然后我在我的模板中尝试了

{{#each meal in controllers.meals.content}}
    TEST
{{/each}}

...但没有显示任何内容。我实际上尝试了其他几种方法,但没有任何效果。

我怀疑在输入 meals 路由之前可能没有设置 MealsController 的模型。

我完全被困在这里,文档没有帮助。非常感谢任何帮助。

【问题讨论】:

    标签: ember.js ember-controllers


    【解决方案1】:

    您需要手动从服务器请求模型,如下所示:

    App.FoodRoute = Ember.Route.extend({
        model:function(params){
            var store = this.store;
            return Ember.RSVP.hash({
                food:store.find('food',params.food_id),
                meals:store.find('meals')
            });
        },
        controllerSetup:function(controller,models) {
           controller.set('model',models.food);
           this.controllerFor('meals').set('model',models.meals);
        }
    });
    

    当您的应用进入 Food 路由时,它会同时请求当前的食物和所有的餐点。然后它将为食物控制器设置模型,并将所有餐点设置为餐点控制器上的模型。您应该能够在您的模板中访问它们,因为您已经根据需要进行了设置。

    【讨论】:

    • 非常感谢您简洁明了的回答。我刚刚想到的另一个选择是在应用程序路由中请求膳食(来自商店),然后使用controllerFor 在膳食控制器上设置“内容”属性。我最初尝试直接在 Food.Route 中执行上述操作,但没有奏效。我现在将测试您的解决方案。
    • 目前在尝试您的解决方案时,我收到错误 Error: undefined is not a function。请注意,Food 没有实现 Ember 数据适配器,因此不使用商店。不知道如何调试。
    • 尝试将 RSVP.hash 中的食物行更改为获取食物项的方式。您知道是哪条线路导致了问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多