Ember: 获取控制器中的模型数据

Ember: Getting model data in the controller

我是 ember 的新手,我正在构建一个 DnD 角色 sheet 来学习和练习。现在我在访问控制器中的模型数据时遇到了很多麻烦。经过数小时的阅读相关帖子后,它只是没有点击,我想我误解了我传递给控制器​​的内容。

基本上我想做的是从模型中获取数据,这样我就可以对它们进行计算,然后在页面上显示这些计算的结果。

这是我的 transforms/router.js:

Router.map(function() {
    this.route('characters', { path: '/'})
    this.route('new', {path: 'new'});
    this.route('view', {path: '/:character_id'});
});

所以我在这里尝试调出角色ID为URL的查看页面。接下来是我的查看页面路线:

export default Route.extend({
    character: function () {
       return this.store.findRecord('character', id)
    }
});

所以这是找到我传递的id的角色的记录。我的 link 看起来像这样并且来自一个组件:

    <h5 class="card-title">{{#link-to 'view' id}}{{name}}{{/link-to}}</h5>

现在我有了视图页面的控制器,如下所示:

init(id){
    let character = this.get('character')
}

当我尝试记录字符时,它仍然是未定义的。在开发工具中查看 ember 信息时,页面似乎在我刷新页面后从模型中获取信息,但我似乎无法弄清楚如何在控制器本身中获取该信息以进行操作它。

我已经尝试解决这个问题很长一段时间了,但它变得非常令人沮丧。我目前有一个解决方案,我可以预先进行计算,并将所有计算结果也存储在模型中,但是在我学习的同时,我想了解它是如何工作的。谢谢提前。

编辑:正如下面的评论中所指出的,我在定义字符时缺少 let。

您的模型挂钩似乎有误。您正在使用 id 但从未定义它。可能你想要的更像这样:

character(params) {
  return this.store.findRecord('character', params.character_id);
}

接下来你的 init 钩子毫无意义:

init(id){
  let character = this.get('character')
}

首先没有id传递给init hook。其次你错过了 this._super(...arguments) 当你覆盖 init.

时应该 always 被调用

最后是您的控制器是首先创建的,稍后填充了模型。此外,模型填充为 model 属性,而不是 character.

所以您可以将它放在您的路线模板中,它会起作用:

This is character {{model.id}}

或者,如果您想在将某些内容传递给模板之前进行更改,您应该在控制器中使用计算 属性:

foo: computed('model.id', function() {
  return this.get('model.id') + ' is the id of the character';
}),

但是,要运行此代码,您需要使用。最简单的使用方法是将其放入您的模板中:

{{foo}}