2016-04-05 5 views
0

は、私は次のようなダイアログのモデルがあります:あなたは上記のコードから見ることができるように変更時に階層モデルを更新する適切な方法は何ですか?

var DialogModel = Backbone.Model.extend({ 

    user: null, 

    constructor: function() { 
     // Initialize user model 
     this.user = new BW.user.UserModel(); 

     Backbone.Model.apply(this, arguments); 
    }, 

    parse: function (attributes) { 
     _.isObject(attributes) || (attributes = {}); 

     // update user's model data 
     this.user.set(attributes.user); 
     delete attributes.user; 

     return attributes; 
    }, 

    toJSON: fucntion() { 
     var json = Backbone.Model.prototype.toJSON.call(this); 

     // serialize user's model data to JSON 
     _.extend(json, user: this.model.toJSON()); 
    } 
}); 

を、私はDialogModeluserモデルを格納し、parseにデータを設定し、toJSONにシリアライズ。私は次の操作を行い、このメッセージデータに基づいてダイアログを更新するには

{ 
    id: 1, 
    message: 'message', 
    user: { 
     <JSON USER DATA> 
    } 
} 

:いくつかのポイントとして

時に、私は次のようなデータを持つdialog:updateソケットメッセージを取得

eventBus.on('dialog:update', function (json) { 
    dialogModel.set(json); 
}); 

しかし、問題はありますそのuserモデルは更新されません。parseメソッドは実行されません。

だから私の質問はどのように私はset方法にuserモデルを更新できますか?

+0

[ '解析()' '(設定によって呼び出されていない)'](https://github.com/jashkenas/backbone/blob/master/backbone.js#L464)。手動で呼び出すか、 'DialogModel'自体(' initialize'の中で)を 'change'で聞き、' user'を更新してください。私の意見では、このUserModelを(コントローラに)移動して、両方のモデルを別々にフィードしてください。 –

+0

'UserModel'をコントローラに移動するのはなぜですか?バックボーンのような階層的なモデルを構築しています。http://backbonejs.org/#Model-constructor – Erik

答えて

0

1つのオプションは、model.setを上書きすることです。それがうまくユーザデータを設定しますので、防止(私たちのための属性からそれを削除するので、私はparseメソッドを呼び出すために選択した

set: function (attributes, options) { 
    this.parse(attributes); 
    Backbone.Model.prototype.set.apply(this, arguments); 
}, 

注:お使いのDialogModelに次のようなものを追加すると、トリックを行いますそのデータはdialogModelに設定されています)。

Click here for a fiddle demonstrating this solution

関連する問題