ember.js - 如何在 Ember 中减少模型钩子的负载
问题描述
我有一个 routes/paper.js 文件,它有下面的模型钩子
model(params,transition){
let user = store.getRequest('user','paper/user')
let address = store.getRequest('address','paper/address')
return RSVP.hash({
user,
address
}).then((model) => {
set(model, 'address_name', get(model.address, 'name'));
return ...model
})
}
我想通过将 api 请求移动到控制器并在 setcontroller 中使用它来减少模型钩子的负载。但是模型没有数据,请在下面找到我的修改
//控制器/paper.js
testerfunction(params){
let user = store.getRequest('user','paper/user')
let address = store.getRequest('address','paper/address')
let paperId = params.paperID
return RSVP.hash({
paperID: paperID,
user,
address
}).then((model) => {
set(model, 'address_name', get(model.address, 'name'));
return ...model
})
}
//routes/paper.js
model(params,transition){
}
setupController(controller,model) {
testerfunction(get(this,'model.params');
}
但我的页面渲染是空白的
解决方案
我建议使用ember-concurrency。您的路线最终会看起来像:
loadUser: task(function * () { return store.getRequest('user','paper/user') })
loadAddress: task(function * () { store.getRequest('address','paper/address') })
loadAddressName: task(function * (addressPromise) {
const address = yield addressPromise
return get(address, 'address_name')
})
model(params, transition) {
const address = this.loadAddress.perform()
const user = this.loadUser.perform()
const address_name = this.loadAddressName.perform(address)
return {
user,
address,
paperID: params.paperID
}
}
作为额外的奖励,您可以在控制器/模板中获得每个加载状态,以便您可以执行以下操作:
{{#unless model.user.isLoading}}
{{model.user.name}}
{{else}}
Some loading state
{{/unless}}
另一种选择是添加在模型钩子加载时呈现的加载模板。您只需在主模板旁边添加一个名为your_template_name_loading.hbs
推荐阅读
- spring - 如何验证 DTO 字符串字段是指定值之一
- r - 在 R 中使用突变
- c# - InvalidOperationException:方案已存在:Identity.Application
- kotlin - 暂停直到 StateFlow 达到所需状态之一并返回结果
- floating-point - ARM Cortex-A9 NEON 和 VFP
- mysql - 将一个表与多个表相关联的数据库模式
- reactjs - 编辑对象状态数组
- maven - 如何在 Maven 构建的詹金斯管道中增加百分比代码覆盖率
- android - 无法在对话框片段中的文本视图上设置文本
- amazon-web-services - 我的弹性搜索批量索引器未正确关闭