0

我创建了具有 2 类用户 admin,user 的 mywebsite。所以,我创建了 3pages mainpag.html, admin.html,user.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 中的必填字段。在模型的 init func 中,我使用 @arr=arr,thenin url 的函数,我像这样检查。

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

我的方法是正确的,还是有更好的方法来动态设置 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

谢谢

4

2 回答 2

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']) 
于 2012-04-18T06:19:54.803 回答
2

其实如果你打电话

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/

于 2012-04-18T06:07:40.580 回答