2

I have a model which links to two sub-models like so:

var SubModel = Backbone.Model.extend({
    defaults: {
        headline: null,
        image_url: null,
        url: null
    }
});

var MainModel = Backbone.Model.extend({
    defaults: {
        subModelA: null,
        subModelB: null,
        title: null
    },

    urlRoot: function() {
        if (this.isNew()) {
            return '/mainmodel/new';
        }
        return '/mainmodel';
    },

    initialize: function() {
        this.fetch();
    },

    parse: function(data) {
        var response = {};
        response.subModelA = new SubModel(data.subModelA);
        response.subModelB = new SubModel(data.subModelB);
        response.title = data.title;
        return response;
    }
});

The issue I'm currently having is that calling var mainModelInstance = new MainModel() does correctly fetch from /mainmodel/new but mainModelInstance.attributes is always a blank object {}.

var mainModelInstance = new MainModel();
mainModelInstance.attributes; // Returns {}

Here is a sample of the server's response to /mainmodel/new:

{
    "title": "Politics",
    "subModelA": {
        "headline": "Investigators: Iran tried to smuggle suicide belts, missiles by boat into Yemen",
        "url": "http://dailycaller.com/2013/02/09/yemen-minister-says-weapons-came-from-iran/",
        "image_url": "http://cdn01.dailycaller.com/wp-content/uploads/2013/02/54c7d52e1a384db489ab9ea568afddb0-e1360455589316.jpg"
    },
    "subModelB": {
        "headline": "Review: Who needs Windows RT? Acer's Iconia W510 runs the real thing",
        "url": "http://arstechnica.com/gadgets/2013/02/review-who-needs-windows-rt-acers-iconia-w510-runs-the-real-thing/",
        "image_url": "http://cdn.arstechnica.net/wp-content/uploads/2013/02/w510-main-640x388.jpg"
    }
}

It seems as though the model's attributes are not being updated via parse. Why aren't the model's attributes being updated?

4

3 に答える 3

6

あなたのコードは機能しているかもしれませんが、正しくテストしていません

this.fetchyout initialize メソッドで呼び出しています。呼び出しmodel.fetchは非同期呼び出しであり、評価しようとするmainModelInstance.attributesと、http 要求呼び出しはまだ完了していません。

これを次の方法でテストする必要があります。

var mainModelInstance = new MainModel();
mainModelInstance.on('change', function() {
  console.log(mainModelInstance.toJSON());
});

または、さらに良いことに、自動フェッチをオンにinitializeせず (ベスト プラクティスではありません)、jQuery promise パターンを使用します。

var mainModelInstance = new MainModel();
mainModelInstance.fetch().done(function () {
  console.log(mainModelInstance.toJSON());
});
于 2013-02-10T07:22:46.577 に答える
3

これは進行中の回答にすぎません。コメントで自由に議論してください。

私はあなたのMainModel定義を次のように変更します:

subModelA: new SubModelA(),
subModelB: new SubModelB(),
parse: function(data){
   this.subModelA.set(data.subModelA);
   this.subModelB.set(data.subModelB);
   return data;  // we keep two copies of the data, in mainModel and submodels.
}

したがって、サーバーが回答とまったく同じように応答すると仮定します

var model = new MainModel();
model.get('title'); // Politics
model.subModelA.get('headline'); // Investigators: Iran tr...

次に、サーバーに戻す方法に応じて、save メソッドをオーバーライドする必要がある場合があります — これは機能する可能性があります。

save: function(key, val, options) {
  this.set({
    subModelA: this.subModelA.toJSON(),
    subModelB: this.subModelB.toJSON()
  });
  Backbone.Model.prototype.save.apply(this, arguments);
}
于 2013-02-10T05:56:54.987 に答える
1

defaultsまず、次のように、デフォルトの属性値をオプションに入れる必要があります。

var SubModel = Backbone.Model.extend({
  defaults: {
    headline: null,
    image_url: null,
    url: null
  }
});

次に、新しいインスタンスを作成するときにサーバーに保存する値があります。mainModelInstance.attributesそれはまたあなたのハッシュをいっぱいにします。

解析の問題についてはconsole.log、サーバーから返されたものにログイン ( ) しましたか?

于 2013-02-10T04:54:35.610 に答える