0

我正在尝试使用 parse.com 连接模型和集合,但我很困惑。我正在尝试使用骨干网和javascript api parse.com通过集合获取,但比较此错误:POST https://api.parse.com/1/classes 404(未找到)。

模型:

    var Person = Backbone.Model.extend({


  defaults:{




      },


  initialize:function(){
          console.log("inperson");
          this.validate();
          this.send();
      },

  validate:function(){
          console.log("validate");
      },

      send:function(){
           var user = new Parse.User();
           user.set("username", this.get("username"));
           user.set("password", this.get("password"));
           user.set("email", this.get("email"));



           user.signUp(null, {
           success: function(user) {
// Hooray! Let them use the app now.
            },
           error: function(user, error) {
// Show the error message somewhere and let the user try again.
           alert("Error: " + error.code + " " + error.message);
           }
 });


      }






});




  return Person;
  });

收藏:

  var Usercollection = Parse.Collection.extend({

 model:Person,



  initialize:function(){




 }

  });






return Usercollection;



});

最后是调用集合和获取的视图:

var HomeView = Backbone.View.extend({

template: Handlebars.compile(template),

 events: {


  },

  initialize: function() {

      console.log("inhomeview");

      var amici = new Usercollection();
    amici.fetch({
  success: function(collection) {
   amici.each(function(object) {
  console.warn(object);
});
},
error: function(amici, error) {
// The collection could not be retrieved.
}
 }); 



  },

   render: function() {


    }



 });

 return HomeView;

});
4

1 回答 1

0

您不能将主干集合和模型交换为 Parse 的集合吗?(您只使用了集合的 Parse 类型,而不是模型!)尝试将 Backbone 模型切换为 Parse.Object 。

下面一步一步来:

首先让我们在 Parse.com 上创建一个新应用程序,我的应用程序名为 FunkyAppartments。将用于加载 Parse javascript lib 的脚本标记插入 index.html 或其他任何内容:

<script src="http://www.parsecdn.com/js/parse-1.5.0.min.js"></script>

将主干模型和集合切换为使用解析类型(如果您有扩展主干,请重命名 fetch 方法,因为我们不想覆盖解析之一):

  //var Appartment = Backbone.Model.extend(); Backbone wo. Parse.com
  var Appartment = Parse.Object.extend("Appartment");

  //var Appartments = Backbone.Collection.extend({ Backbone wo. Parse.com
  var Appartments = Parse.Collection.extend({
    model: Appartment,
    loadAppartments: function(callback){
      debugger;
      this.query = new Parse.Query(Appartment);
      this.fetch();
    }

  });

我在加载 appartments 中添加了一个调试器标签,以便开发人员工具在控制器中间中断,在这里我可以访问控制器的 Appartment 私有类型,因此我可以在解析服务器上存储一些数据并通过粘贴以下内容进行验证在开发者工具控制台中。

var testAppartment = new Appartment();
testAppartment.save({name: "foobars"}).then(function(object) {
  alert("yay! it worked");
});

是的,数据显示在我们刚刚添加的应用程序的 parse.com UI 中。更重要的是,它出现在我们的前端。那很简单!

更新:BACKBONE 1.2.1、MARIONETTE 2.4.2、UNDERSCORE 1.8.3 的问题

我注意到我实际上一直在使用旧版本的 marionette、backbone 和 underscore.js。最初的更新似乎破坏了该应用程序。

经过一些研究,我发现解析部分没有返回成功渲染的对象。因此,我将集合类型改回了以下扩展名:Backbone.collection 而不是 Parse.collection。

我还必须重写查询方法,因为对象不会保存在正确的 id 上,更新对象会导致添加新对象而不是更新旧对象。

var Apartment = Parse.Object.extend('Appartment');

var Apartments = Backbone.Collection.extend({
  model: Apartment,
  query: new Parse.Query(Apartment),
  initialize: function(){
    MyApp.vent.on('search:param', function(param){self.search(param); });
    var self = this;
    this.query.find({
        success: function(results){
            self.reset();
            results.forEach(function(result){
              result.attributes.id__ = result.id
              var ap = new Apartment(result.attributes);
              self.add(ap);
            });
          }
      });
  }
});

我添加了一个属性: id__ 来保存解析 id(将其命名为 id 不起作用,因为它的主干干扰了它,使其消失)。最后,在保存模型以解析时,我在保存调用中使用了 id__ 作为 id:

  var ApartmentEditView = Backbone.Marionette.ItemView.extend({
    template: "#apartment-edit-template",
    className: "apartmentDetail",
    events: {
      "click .store": "storeEdit",
      "click .close": "closeEdit"
    },
    storeEdit: function(){
      var priceNum = Number($('#price_field').val().replace(/\s/g, ''));

      this.model.set({
        id: this.model.attributes.id__,
        name:$('#name_field').val(),
        price:priceNum,
        description:$('#desc_field').val(),
        url:$('#url_field').val()
      });
      this.model.save();
      this.closeEdit();
    },
    closeEdit: function(){
      var detailView = new ApartmentDetailView({model: this.model});
      MyApp.Subletting.layout.details.show(detailView);
    }
  });

现在该对象已在数据库中正确更新。

于 2015-07-28T22:21:49.787 回答