Javascript 余烬数据:DS.Store.createRecord上的模型刷新
埃姆伯斯特 我正在试图找出创建新记录并将其保存到商店后,我的模型没有刷新的原因。 我的路线计算Javascript 余烬数据:DS.Store.createRecord上的模型刷新,javascript,ember.js,ember-data,handlebars.js,Javascript,Ember.js,Ember Data,Handlebars.js,埃姆伯斯特 我正在试图找出创建新记录并将其保存到商店后,我的模型没有刷新的原因。 我的路线计算模型,如下所示: 然后,我的模板呈现一个列表和一个按钮: 当我单击[跟随]按钮时: 发送成功的POST请求 按钮未更新 列表未更新 当我(然后刷新页面)单击[Unfollow]按钮: 发送成功的删除请求 按钮未更新 列表已更新 你知道我做错了什么吗? 可能是我的有效载荷有问题吗 编辑:解决了! 嗯,听起来我对恩伯的期望太高了 框架不会在store.createRecord('post-foll
模型
,如下所示:
然后,我的模板呈现一个列表和一个按钮:
当我单击[跟随]
按钮时:
- 发送成功的
请求POST
- 按钮未更新
- 列表未更新
[Unfollow]
按钮:
- 发送成功的
删除
请求
- 按钮未更新
- 列表已更新
可能是我的有效载荷有问题吗
编辑:解决了! 嗯,听起来我对恩伯的期望太高了 框架不会在
store.createRecord('post-following',{…})
调用上自动更新我的post-following
s数组
然后,我调整控制器逻辑以“手动”更新我的模型:
// in follow action…
userFollowing.save().then( function(){
var followings = store.query('post-following', {
filter: { post: postID }
}).then( function (followings) {
_this.set('model.userFollowing', userFollowing);
_this.set('model.followings', followings);
}) ;
});
// in unFollow action…
userFollowing.destroyRecord().then( function () {
_this.set('model.userFollowing', null);
_this.notifyPropertyChange('model.followings') ;
});
请注意我的后端API设计受到@duizendnegen的批评(见评论)。更多的最佳实践
谢谢你的帮助Brou当您进入页面时,将设置您的模型。进行更改时,模型不会更改。销毁记录时更新列表的唯一原因是因为它不再存在。单击“跟随”按钮或“取消跟随”按钮后重新加载模型,或手动更改列表/按钮的值。您的问题在于您没有将属性
模型
重新设置为指向新创建的对象。您总是访问相同的模型
属性,即使在创建新属性之后也是如此
首先要注意的是,在路由中的model
钩子之后,调用setupController
钩子执行以下操作:
controller.set('model', resolvedModel)
这意味着您的控制器上的model
属性在默认情况下是在每次加载路由时设置的(model
钩子解析)。但是,在创建新记录后,不会发生这种情况,因此必须明确执行:
let newModel = this.store.createRecord('post-following', {
user: user,
post: post
})
// since model.save() returns a promise
// we wait for a successfull save before
// re-setting the `model` property
newModel.save().then(() => {
this.set('model', newModel);
});
为了更清晰的设计,我还建议您为model
属性创建一个别名,该别名更具体地描述您的模型,或者覆盖setupController
的默认行为(如果您也在控制器上进行一些初始设置)。因此,要么:
export default Ember.Controller.extend({
// ...
blog: Ember.computed.alias('model') // more descriptive model name
// ...
});
或:
对于这类问题,有一个较小的、重复的问题(例如,通过余烬旋转)确实有帮助 基本上,新的
post following
记录与filter
不匹配:它是针对属性{post:123}
进行筛选的,并且您的post following
对象在{post:{id:123,name:}
行中包含一些内容。此外,您的post following
对象不包含名为filter
的属性或它可能是什么-即,它对服务器执行的查询与您希望在客户端上进行筛选的查询不同
我的方法是,作为对
遵循
和取消遵循
操作的响应,更新模型
,用户遵循
和以下
感谢您的回答!不过,我在我的模型钩子中提出了10个请求,所以触发一次完整的模型刷新感觉不是很好。您知道如何触发子模型刷新吗?(即,model.following
和model.userFollowing
仅适用于)在构建模型的方式上,这确实是可能的。您可以使用这样的东西:this.store.query()。然后(result=>{this.get('currentModel').set('followers',result);})非常感谢您的帮助!Fiddle:我试过了,但听起来不可能使用FixtureAdapter调用store.query
。//模型:我的后端筛选逻辑是:GET/postFollowers?filter[post]=123
。filter[…]
语法在过滤、排序和元数据QS参数之间提供了更清晰的API分离。它会弄乱余烬吗?//你的方法:我以前就是这么做的。它在视觉上正常工作,但在尝试设置我的模型时引发了一个奇怪的空{}
错误。我也觉得灰烬应该独自处理刷新…这真的是一个好方法吗?谢谢你的提示和帮助!正如@duizendnegen所提到的,在我的请求之后“手动”设置模型是我以前的方法。它在视觉上正常工作,但在尝试设置我的模型时引发了一个奇怪的空{}
错误。我还觉得ember应该单独处理刷新…这真的是一个好方法吗?好的,您显示的代码希望稍后显示您创建的模型。因此,除非你明确告诉它,否则它不会自动知道你做了这件事。这显示了默认情况下ember数据如何缓存模型以及如何使其始终重新加载。
controller.set('model', resolvedModel)
let newModel = this.store.createRecord('post-following', {
user: user,
post: post
})
// since model.save() returns a promise
// we wait for a successfull save before
// re-setting the `model` property
newModel.save().then(() => {
this.set('model', newModel);
});
export default Ember.Controller.extend({
// ...
blog: Ember.computed.alias('model') // more descriptive model name
// ...
});
export default Ember.Route.extend({
// ...
setupController(controller, resolvedModel) {
controller.set('blog', resolvedModel); // more descriptive model name
// do other setup
}
// ...
});