Ember-data:DS.Store.createRecord上的模型刷新

时间:2016-04-04 15:20:42

标签: javascript ember.js ember-data handlebars.js

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中的更多最佳做法。

感谢您的帮助!!!
布鲁

3 个答案:

答案 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的属性或它可能是什么 - 即它对服务器执行的查询与您希望在客户端上过滤的查询不同。

我的方法是,作为对followunfollow操作的回复,更新modeluserFollowingfollowings

答案 2 :(得分:0)

进入页面时设置了您的模型。进行更改后,您的模型不会发生变化。销毁记录时更新列表的唯一原因是因为它根本不存在。单击“关注”按钮或取消关注按钮后重新加载模型,或手动更改列表/按钮的值。