Javascript “Ember.js”;“已销毁对象上的调用集”;调用unloadRecord后出错
在我正在处理的一个项目的会话系统中,我正在调用Javascript “Ember.js”;“已销毁对象上的调用集”;调用unloadRecord后出错,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,在我正在处理的一个项目的会话系统中,我正在调用unloadRecord,记录如下: user.unloadRecord(); 我没有调用destroyRecord,因为我想从存储中手动卸载该记录,而不将其保存到服务器。以这种方式从存储中删除记录效果很好,但当我登录到同一个帐户时——这需要从服务器加载同一个用户记录,并使用store.push将其手动插入存储。我会收到以下错误消息: Uncaught Error: Assertion Failed: calling set on destroye
unloadRecord
,记录如下:
user.unloadRecord();
我没有调用destroyRecord
,因为我想从存储中手动卸载该记录,而不将其保存到服务器。以这种方式从存储中删除记录效果很好,但当我登录到同一个帐户时——这需要从服务器加载同一个用户记录,并使用store.push将其手动插入存储。我会收到以下错误消息:
Uncaught Error: Assertion Failed: calling set on destroyed object ember.js:3902
在调用user.unloadRecord()
之后,在下面的一行再次出现这种情况:
其中,response
是POST
请求返回给/session的JSON有效负载,如下所示:
{
"sessionToken":"f7a7247467b08818ead27441838df30fed0e0a79",
"user": {
"id":"5499bf5b7f25680761c9df7a",
"email":"test@gmail.com",
"accounts": [/* [account ids] */],
"syncPaths":[/* [sync path ids] */]
}
}
有没有办法避免这个错误
更新:
为了响应查看更多代码的请求,是包含unloadRecord
调用的文件,也是包含store.push
调用的文件
更新2:
我包括了一个通过POST请求返回给/session的JSON负载示例。以下是用户的模型
:
DS.Model.extend({
email: DS.attr("string"),
accounts: DS.hasMany("account"),
syncPaths: DS.hasMany("syncPaths")
});
我一直在努力解决类似的问题,尽管是unloadAll()
。
这是别人建议的,所以可能对你有帮助
在源代码中,ember.js
或ember.debug.js
如果在本地运行,请查找以下行:
Ember['default'].assert('已销毁对象上的调用集',!obj.isDestroyed)代码>
并将其更改为:
Ember['default'].assert(“已销毁对象上的调用集('“+keyName+”)”,!obj.isDestroyed)代码>
然后您将看到属性被设置,它可能会帮助您跟踪代码中挂起的位置。对我来说,keyName
只是“长度”,这并没有多大帮助。你能发布更多的代码吗?您在哪里调用destroy?为什么需要手动重新加载用户记录?我认为,一旦卸载了记录,您就需要从服务器获取。@Oren,没有任何其他与错误相关的代码——这些行附近的所有其他内容都与加载用户
记录无关。我已经用Github上相应文件的链接更新了这个问题。我从不调用destroy
,因为我使用了堆栈溢出应答中解释的unloadRecord
。@Matt,说来话长,但当用户登录时,我会使用用户的凭据向/session发出POST请求。请求返回一个会话令牌和一个user
记录,然后我将其手动推入存储,如问题中所述。使用RESTAdapter加载用户是否是一个选项?可能通过创建LoginRestapter来处理会话/用户api请求,而不是使用ajax调用?我不能确定,但感觉像是Ajax调用和推送到商店的结合让Ember变得不稳定(它认为有一个RestaAdapter,但你有另一个Ajax调用,导致东西被推到商店)。你找到了解决问题的方法吗?有完全相同的错误,keyName
只是length
。有关于这个主题的新闻吗?我实际上刚刚找到了答案!您需要首先为每个关系模型调用this.store.unloadAll()
。
DS.Model.extend({
email: DS.attr("string"),
accounts: DS.hasMany("account"),
syncPaths: DS.hasMany("syncPaths")
});