Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 余烬数据:DS.Store.createRecord上的模型刷新_Javascript_Ember.js_Ember Data_Handlebars.js - Fatal编程技术网

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
  }

  // ...
});