我创建了mywebsite,有两种类型的用户admin,user。所以,我创建了3pages mainpag.html,admin.html,user.html。以及每个模型,视图,集合,routers.js文件。因此,登录后,当我发送到不同模型的单独html页面时,我无法自动获取用户模型。所以我这样做了:
首先,我对服务器进行了ajax调用,询问_id(会话中的用户名,所以我可以获取id)
从id,我通过model.fetch()获取模型,然后我获得了包含所有属性的usermodel。
然后在fetch的成功回调中,我做了model.save({weight:“somevalue”})。根据我的说法,它应该正确更新,因为模型已经可用,属性权重也可用一些旧值,但它发送POST请求,当我尝试model.isNew()时,它返回true。我哪里错了?我怎样才能更新我的模型?如果需要,我会发布更多细节。
更多详情:
如果我删除了该保存方法,那么我将在模型中获得正确的属性。
如果我不删除该保存方法,那么成功和错误回调也会在模型中显示为属性。
代码:
addWeight : (e)->
arr=new Array()
arr['_id']=app._id
console.log "asdasd"
console.log arr
console.log arr['_id']
@user_model =new UserModel(arr)
@user_model.fetch({
success : (model,res,options) =>
console.log model
console.log res
arr=new Array()
arr['_id']=e.target.id
#arr['action']='weight' #means , update weight
#@user_model.setArr(arr)
#@user_model.set({weight : arr['_id']})
console.log "new : "+@user_model.isNew()
@user_model.save({weight : e.target.id})
#@user_model.save({
# success : (model,res,options) =>
# console.log "model updated: "+JSON.stringify(model)
# console.log "Res : "+JSON.stringify(res)
# error : (model,res,options) =>
# console.log "Error : "+JSON.stringify(res)
#})
error : (model,res,options) =>
console.log "Error "
})
上面的代码是用coffeescript编写的,所以即使你不知道coffeescript,也不要担心,你可以轻松理解,而那些#意味着,这是一个评论。在这里我们遵循缩进而不是大括号。
还有一个疑问,模型的url必须根据需求动态更改,对吧?实现这一目标的最佳方法是什么?我这样做:我正在填充“数组”,其中包含应该存在于网址中的必填字段。在模型中,s init func,我正在使用@ arr = arr,然后使用url的函数,我这样检查。
url : ->
if @arr['id']
"/user/#{@id}"
我的方法是否正确,还是有更好的方法来动态设置网址。或者我可以直接设置网址:
@user_model.setUrl "/someurl/someid" //this setUrl method is available in model's definition
@user_model.fetch() or save() or watever that needs url
感谢
答案 0 :(得分:3)
只是预感,但您提到您致电model.fetch()
来检索_id
字段。请务必返回id
字段,而不是_id
(请注意下划线)。
对model.isNew()
返回true
的调用表明id
属性从未在model.fetch()
调用中设置。
我期待您的代码可能进一步解释...... 看看你的代码:
/* The model needs an 'id' attribute in order to marked as not new */
@user_model = new UserModel(id: arr['_id'])
答案 1 :(得分:2)
其实如果你打电话
model.set({weight: "somevalue"});
它将更新模型中的值,但不会发送POST请求
model.save(attribute);
实际上你可能已经知道了Backbone.sync。
编辑:
你可能想要ot set
m = Backbone.Model.extend({
idAttribute: '_id'
});
到每个模型,因为isNew方法实际检查模型是否具有id属性
关于这一点,你可以在这里看到.set不会在这里调用backbone.sync:http://jsfiddle.net/5M9HH/1/