Embsters!
我想知道为什么我的模型在创建新记录并将其保存到商店后没有刷新。
我的路线按如下方式计算model
:
model: function (params) {
var postID = params.post_id,
userID = this.get('session.currentUser.id');
var post = this.store.findRecord('post', postID) ;
var followings = this.store.query('post-following', {
filter: { post: postID }
}) ;
var userFollowing = this.store.queryRecord('post-following', {
filter: { post: postID, user: userID }
}) ;
return new Ember.RSVP.hash({
post: post,
followings: followings,
userFollowing: userFollowing
});
}
我的模板然后呈现列表和按钮:
{{#each model.followings as |following|}}
...
{{/each}}
{{#if model.userFollowing}}
<button {{action 'follow'}}>Follow</button>
{{else}}
<button {{action 'unFollow'}}>Unfollow</button>
{{/if}}
我的控制器创建/删除相关的post-following
记录:
actions: {
follow: function () {
var user = this.get('session.currentUser'),
post = this.get('model.post') ;
this.store.createRecord('post-following', {
user: user,
post: post
}).save();
},
unFollow: function () {
this.get('model.userFollowing').destroyRecord() ;
}
}
点击[Follow]
按钮时:
POST
请求 当我(然后刷新页面)时,点击[Unfollow]
按钮:
DELETE
请求 你知道我做错了什么吗?
这可能是我的有效载荷的问题吗?
<小时/>
嗯,听起来我对余哥的期望太高了。
该框架不会在post-following
调用时自动更新我的store.createRecord('post-following', {...})
数组。
然后我调整了控制器逻辑以“手动”更新我的模型:
// 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的批评(请参阅评论)。 this article中的更多最佳做法。
感谢您的帮助!!!
布鲁
答案 0 :(得分:1)
您的问题是您没有重新设置属性model
以指向新创建的对象。即使在创建新属性后,您也始终访问相同的model
属性。
首先要注意的是,在路由中的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
// ...
});
或者:
export default Ember.Route.extend({
// ...
setupController(controller, resolvedModel) {
controller.set('blog', resolvedModel); // more descriptive model name
// do other setup
}
// ...
});
答案 1 :(得分:1)
对于这些问题,有一个较小的,复制的问题(例如通过Ember Twiddle)确实很有帮助
从根本上说,新的post-following
记录与filter
不匹配:它会针对属性{ post: 123 }
进行过滤,而您的post-following
对象包含{ post: { id: 123, name: "" } }
行中的内容{1}}。此外,您的post-following
对象不包含名为filter
的属性或它可能是什么 - 即它对服务器执行的查询与您希望在客户端上过滤的查询不同。
我的方法是,作为对follow
和unfollow
操作的回复,更新model
,userFollowing
和followings
。
答案 2 :(得分:0)
进入页面时设置了您的模型。进行更改后,您的模型不会发生变化。销毁记录时更新列表的唯一原因是因为它根本不存在。单击“关注”按钮或取消关注按钮后重新加载模型,或手动更改列表/按钮的值。