先说点铺垫
都知道Backbone
的model
实例持久化与否,是要看是否存在id
属性的。fetch
回的数据是一定要带着id
的,以表此对象已相对后台持久化(当然,id
可以在parse
中自行处理,这不是重点)
那比如我新实例化一个model
,填充了数据之后save
了一下,当然也就发起了一个POST
请求去新增数据,这里现在是没有id
的,那么新增成功返回的数据肯定也是要带着新增后生成的id
的,现在的问题是,返回的数据格式应该是怎样的?单纯的{id: 'xxx'}
是不是就可以让Backbone
自行维护这个model
实例了?
后台哥们儿不在,现在不方便测试,所以特来向各位GOD证实一下我的猜测。网上压根没搜到。XD
直接返回id就可以了
我们 post 上的数据大概这样子的,会创建 id
然后后台返回的数据大概这样子
我天。。竟然没有个知道的??
既然没有知道的,我就把我暂时想到的解决方案PO
上来吧。
假设那个打算请求后台新建
的Backbone.Model
实例叫做model
经过对这个model
一顿set
操作之后(当然,也可以放到save
的第一个参数中),这时候我要save
了model.save
第二个参数option
兼容jQuery
的ajax
的那些参数,比如success
、error
还有complete
之类的,当然,其中还有一个dataFilter
(详见jQuery
文档)
在这个dataFilter
预先处理服务器响应的数据,记得return
JSON
格式的字符串数据,只需要包含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
了。
当然如果有更好的答案,欢迎补充。