我是ember的新手,我正在构建一个DnD字符表来学习和练习。现在,在访问控制器中的模型数据时遇到很多麻烦。经过数小时的阅读相关文章后,它只是没有点击,我想我误会了我传递给控制器的内容。
基本上我想做的是从模型中获取数据,这样我就可以对它们进行计算,然后在页面上显示这些计算的结果。
这是我的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查找字符的记录。我的链接看起来像这样,它来自某个组件:
<h5 class="card-title">{{#link-to 'view' id}}{{name}}{{/link-to}}</h5>
现在,我有了用于查看页面的控制器,它看起来像这样:
init(id){
let character = this.get('character')
}
当我尝试记录字符时,它仍未定义。在开发工具中查看余烬信息时,似乎页面是在刷新页面后从模型中获取信息的,但是我似乎无法弄清楚如何在控制器本身中获取该信息来进行操作。>
我已经尝试了好一阵子了,它变得非常令人沮丧。我目前有一个工作区,可以事先进行计算,也可以将所有计算的结果也存储在模型中,但是在学习的同时,我想了解它是如何工作的。谢谢。
编辑:正如下面的评论所指出的那样,定义字符时我错过了let。
答案 0 :(得分:1)
您的模型挂钩似乎有问题。您正在使用id
,但从未对其进行定义。可能您想要的更像是这样:
character(params) {
return this.store.findRecord('character', params.character_id);
}
接下来,您的init
钩没有意义:
init(id){
let character = this.get('character')
}
首先,没有id
传递给初始化挂钩。其次,您缺少this._super(...arguments)
,当您覆盖init
时应始终调用它们。
最后是您的控制器是 first 首先创建的,并且以后均已填充模型。此外,模型填充为model
属性,而不是character
属性。
因此您可以将其放置在路线模板中,并且可以使用:
This is character {{model.id}}
或者,如果要在将某些内容传递给模板之前进行更改,则应在控制器中使用计算属性:
foo: computed('model.id', function() {
return this.get('model.id') + ' is the id of the character';
}),
但是要使此代码运行,您需要 使用。最简单的使用方法是将其放入模板:
{{foo}}