先说点铺垫
都知道Backbone的model实例持久化与否,是要看是否存在id属性的。fetch回的数据是一定要带着id的,以表此对象已相对后台持久化(当然,id可以在parse中自行处理,这不是重点)
那比如我新实例化一个model,填充了数据之后save了一下,当然也就发起了一个POST请求去新增数据,这里现在是没有id的,那么新增成功返回的数据肯定也是要带着新增后生成的id的,现在的问题是,返回的数据格式应该是怎样的?单纯的{id: 'xxx'}是不是就可以让Backbone自行维护这个model实例了?
后台哥们儿不在,现在不方便测试,所以特来向各位GOD证实一下我的猜测。网上压根没搜到。XD
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
我天。。竟然没有个知道的??既然没有知道的,我就把我暂时想到的解决方案
PO上来吧。假设那个打算请求后台
新建的Backbone.Model实例叫做model经过对这个
model一顿set操作之后(当然,也可以放到save的第一个参数中),这时候我要save了model.save第二个参数option兼容jQuery的ajax的那些参数,比如success、error还有complete之类的,当然,其中还有一个dataFilter(详见jQuery文档)在这个
dataFilter预先处理服务器响应的数据,记得returnJSON格式的字符串数据,只需要包含id就可以了,e.g.:'{"id":"xxx"}'(刚刚测试来着,后来忘了是不是一定要严格遵循标准JSON格式了,即属性和值都是双引号)但是这里有
两点需要注意的是:Backbone将success又封装了一层,success的第一个参数并不是服务器响应的数据原型,而是经过处理的Model实例(所以我选择在success之前执行的dataFilter中处理数据);就算是这样处理了,让
Backbone自行维护了这个Model实例,但model.hasChanged()依然是true,model.changedAttributes()会显示{id: 'xxx'}。我的做法是,强行把这个状态重置掉:model.changed = {};。然后model.hasChanged()就是false了。当然如果有更好的答案,欢迎补充。
我们 post 上的数据大概这样子的,会创建 id
然后后台返回的数据大概这样子
直接返回id就可以了