主干 - 获取模型,设置属性(修改),然后保存模型,它应该更新但发送POST请求

时间:2012-04-18 05:41:17

标签: backbone.js

我创建了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

感谢

2 个答案:

答案 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/