0

我正在使用 Backbone 框架和 Parse.com 作为后端服务为 Phonegap 创建一个应用程序。我用 Parse.com 创建了一个对象(对应于 Backbone 模型)。该对象有一个调用 Parse.com 函数 save()的saveDraftToP()方法。从视图调用此方法后,我想检索更新的对象。为此,我将“更改”事件绑定到模型,但解析分配的 ID 未定义。这是模型的代码:

  var Match = Parse.Object.extend("Match", {
  states: {'DRAFT': 0, 'RUNNING': 1, 'ENDED': 2},
  saveDraftToP: function () {
    var self = this;
    this.save({
      user: Parse.User.current(),
      ACL: new Parse.ACL(Parse.User.current()),
      state: self.states.DRAFT
    }, {
      success: function (result) {
        self = result;
      },
      error: function (e) {

      }
    });
  }
});`

这是视图的代码:

       var vmNuovaPartita = Parse.View.extend({
            template: Handlebars.compile(template),
            model: new Match(),
            collection: new HintCollection(),
            initialize: function () {
                this.bind("change:model", console.log(this.model.id) , this);
            },

            render: function (eventName) {
                var match = this.model.toJSON();
                $(this.el).html(this.template(match));
                return this;
            }
        });
4

1 回答 1

0

我不太清楚为什么你有一个保存功能包装在另一个类似保存的功能中。:-)

假设你有类似的东西myMatch是一个对象。

通过您的 UI,单击按钮即可保存对象数据。您可以直接使用myMatch.save({attr:val, ...})开箱即用。Backbone(和 Parse)默认情况下是乐观的。这意味着,您将设置模型的值,并期望持久化到服务器会成功。

因此,您不需要检索任何额外的东西。您已经拥有处于最新状态的模型。

为了有一个响应这些变化的模型视图,我会设计一些不同的视图。

var vmNuovaPartita = Parse.View.extend({
        template: Handlebars.compile(template),
        initialize: function () {
            this.model.on('change', this.render);
        },
        render: function (eventName) {
            var match = this.model.toJSON();
            $(this.el).html(this.template(match));
            return this;
        }
    });

var myView = new vmNuovaPartita({
    model: myModel
});

我会在视图之外初始化模型,然后在生成新视图时将其作为选项传递。当您将模型作为选项传入时,它很特别,将直接附加到视图 ... view.model ,您可以在视图代码中将其称为 this.model

在 init 中,我们在模型上放置一个监听器以获取更改事件,然后触发视图的重新渲染。或者处理这类事情的更好方法是使用该.listenTo()方法加入较新的主干事件。

于 2013-06-27T16:52:21.250 回答