Getting “Error: Assertion Failed: calling set on destroyed object” when trying to rollback a deletion

余生颓废 提交于 2020-01-06 08:26:16

问题


I am looking into how to show proper deletion error message in ember when there is an error coming back from the server. I looked at this topic and followed its suggestion: Ember Data delete fails, how to rollback

My code is just like it, I return a 400 and my catch fires and logs, but nothing happens, when I pause it in the debugger though and try to rollback, I get Error: Assertion Failed: calling set on destroyed object

So A) I cannot rollback B) the error is eaten normally.

Here is my code

visitor.destroyRecord().then(function() {
                    console.log('SUCCESS');
                }).catch(function(response) {
                    console.log('failed to remove', response);
                    visitor.rollback();                        
                });

In case it's relevant, my model does have multiple relationships. What am I doing wrong? Ember-data version is 1.0.0.8 beta (previous one from the release a few days ago).

Thanks in advance.

EDIT

I discovered now that the record actually is restored currently inside the cache according to ember inspector, but the object will not reappear in the rendering of the visitors. I need some way to force it to reload into the template...


回答1:


After destroyRecord, the record is gone and the deletion cannot be rolled back. The catch clause will just catch a server error. If you want the record back, and think it's still on the server, you'll have to reload it.

See the following comment on deleteRecord from the Ember Data source:

Marks the record as deleted but does not save it. You must call
`save` afterwards if you want to persist it. You might use this
method if you want to allow the user to still `rollback()` a
delete after it was made.

This implies that a rollback after save is not possible. There is also no sign anywhere I can see in the Ember Data code for somehow reverting a record deletion when the DELETE request fails.

In theory you might be able to muck with the isDeleted flag, or override various internal hooks, but I'd recommend against that unless you really know how things work.




回答2:


Try reloading the model after the rollback. It will reload from the server but it was the only way around this that I could find.

visitor.destroyRecord().then(function() {
                console.log('SUCCESS');
            }).catch(function(response) {
                console.log('failed to remove', response);
                visitor.rollback();
                visitor.reload().then(function(vis)
                {
                    console.log('visitor.reload :: ' + JSON.stringify(vis));
                });
            });

Hope that helps.



来源:https://stackoverflow.com/questions/25416905/getting-error-assertion-failed-calling-set-on-destroyed-object-when-trying-t

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!