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

pbwdgjma  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(127)

我创建了我的网站有2种类型的用户:管理员和用户。所以,我创建了3个页面mainpag.htmladmin.htmluser.html。和单独的模型,视图,集合,routers.js文件为他们每个人。登录后,因为我发送用户到不同的HTML页面与不同的模型,我不能自动获得用户模型。所以我这样做:
首先,我对服务器进行 AJAX 调用,请求_id(会话中的用户名,这样我就可以获得id)
从id中,我通过model.fetch()获取了模型,然后我得到了包含所有属性的用户模型。
然后在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必须根据需求动态地改变,对吗?实现这一点的最好方法是什么?我是这样做的:
我正在填充包含URL中应该存在的必填字段的“array”。在model,s init func中,我使用@arr=arr,然后在URLs函数中,我这样检查。

url : ->
     if @arr['id']
     "/user/#{@id}"

我的方法是正确的吗?或者有更好的方法来动态设置URL。或者我可以直接设置URL,如下所示:

@user_model.setUrl "/someurl/someid"  //this setUrl method is available in model's definition
    @user_model.fetch() or save() or watever that needs url
utugiqy6

utugiqy61#

这只是一种直觉,但您提到了调用model.fetch()来检索_id字段。请确保返回id字段而不是_id(注意下划线)。
返回truemodel.isNew()调用指示从未从model.fetch()调用中设置id属性。
我期待着一个可能的进一步解释与您的代码...查看您的代码:

/* The model needs an 'id' attribute in order to marked as not new */ 
@user_model = new UserModel(id: arr['_id'])
tpgth1q7

tpgth1q72#

其实如果你打电话

model.set({weight: "somevalue"});

它将更新模型中的值,但不会发送POST请求

model.save(attribute);

实际上调用了Backbone.sync,您可能知道。
编辑:
你可能想

m = Backbone.Model.extend({
    idAttribute: '_id'
});

每个模型,因为isNew方法实际上检查模型是否有id属性
关于这一点,您可以在这里看到.set不调用backbone.sync:http://jsfiddle.net/5M9HH/1/

相关问题