0

我试图在模型内部的 ajax 调用中为模型设置一些属性,但它不起作用。我在 ajax 调用的成功函数中使用了 this.set 但不起作用。我不知道这个的确切方法。

var Person = Backbone.Model.extend({
  url:"https://api.parse.com/1/classes/_User/", defaults:{},
    initialize:function(){
      var self=this.persona;
      console.log("inperson");
      this.upload();    
    },     
    validate:function(){
      console.log("validate");
    },
    upload:function(){
      var serverUrl = 'https://api.parse.com/1/files/' + file.name;
      $.ajax({
        type: "POST",
          beforeSend: function(request) {
            request.setRequestHeader("X-Parse-Application-Id", 'qS0KLMx**1tyhM9EEPiTS3VMk');
            request.setRequestHeader("X-Parse-REST-API-Key", 'nh3eoUo9*s9VQzvbF2gMhcKJIfIt1Gm');
            request.setRequestHeader("Content-Type", file.type);
        },
        url: serverUrl,
        data: file,
        processData: false,
        contentType: false,
        success: function(data) {
          console.log("File available at: " + data.name);
          this.set({image: {"name" :data.name, "__type" : "File"}});//THE PROBLEM IS HERE!!
        },
        error: function(data) {
          var obj = jQuery.parseJSON(data);
          alert(obj.error);
        }
      });            
    }
 });
 return Person;
 });
4

2 回答 2

1

由于underscorejs 是backbonejs 的依赖项,您可以使用_.bind帮助程序:

_.bind(func [, thisArg, arg1, arg2, …])

创建一个函数,在调用该函数时,会func使用 的this 绑定进行调用,thisArg并将任何其他绑定参数添加到传递给绑定函数的参数中。

http://underscorejs.org/#bind

http://lodash.com/docs#bind

success: _.bind(function(data) {
  console.log("File available at: " + data.name);
  this.set({image: {"name" :data.name, "__type" : "File"}});
}, this)

这将允许您访问this成功回调内部。

于 2013-05-17T15:33:08.837 回答
0

$.ajax在/回调中使用它们自己的上下文 ( this) 。successerror

一个好的方法(并使用更少的字符)如下:

var model = this;
$.ajax({
  // Other properties come here
  success: function() {
    console.log("File available at: " + data.name);
    model.set({ image: { "name": data.name, "__type" : "File" } });
  }
})
于 2013-05-17T15:38:03.590 回答