2016-07-07 5 views
0

バックボーンに新しくて、何か問題があります。私が保守を任されているアプリケーション以来、これを一般的なコードなしの方法で求めようとすると、数千行もの長さです...私が明確にできることを望みます。親オブジェクトの兄弟であるモデルのインスタンスの属性を設定するにはどうすればよいですか?

私はメソッドmyMethod()を持っています。これはモデルApp.Personに属しています。

私はApp.Personのいくつかのインスタンスを保持するコレクションApp.PersonListを持っています。

オブジェクトのインスタンスであるオブジェクト(myDonationForm)内に作成しているインスタンス(myPersonList)App.PersonListがあります.App.DonationForm(ここで私の快適ゾーンの外にさらに移動します:App.DonationForm Base.jsと思われるBaseというオブジェクトを拡張するControllerという名前のオブジェクトを拡張しています。ここで何が起きているのかはほとんど分かりませんが、私の必要性は重要ではないと思います)。

また、App.DonationFormでは、モデルApp.Errorsのインスタンス(myErrorMsg)があります。私はmyMethod()からmyErrorsの属性を設定できるようにしたいが、myErrorsを参照するための構文を実行したり、ネストされたオブジェクトのツリーを走査したり、パラレルステップをやり直したりすることはできない。

私はそれが理に適ったと思います。視覚化するには

myDonationForm, inst of App.DonationForm, ext Controller 
|--myPersonList, inst of App.PersonList, ext Collection 
| |--myPerson[1], inst of App.Person, ext Model // I want to change from here 
| | +---myMethod() 
| |--myPerson[2], inst of App.Person, ext Model // or from here 
|  +---myMethod() 
+myErrorMsg, inst of App.Errors, ext Model  // an attribute of this. 

ありがとうございます。


編集コードスニペットを追加する(私はピアレビュー画面を得たゴマと私は偶然Hoyenの答えではなく、自分の質問を編集してみました!それを実現していない、ぐふ)

App.SpecialDonationForm = App.DonationForm.extend({ 
    [...] 
    initialize: function(options){ 
     App.DonationForm.prototype.initialize.call(this, options); 
     [...] 
    }, 
    start: function(){ 
     App.DonationForm.prototype.start.call(this); 
     [...] 
     this.myPersonList = new App.PersonList(this.initialData); 
     this.myErrorMsg = new App.Errors(); 
     [...] 

答えて

0

基本的に、myErrorMsgはBackboneモデルのインスタンスなので、Backboneのモデルメソッドを使用して属性を設定する必要があります。したがって、次のようになります。

App.Person = Backbone.Model.extend(
{ 
    [...] 
    defaults: { 
     [...], 
     errorMsg: new App.Errors() 
    }, 
    [...] 
    myMethod: function(){ 
     var value = ""; // set it to what ever you like 
     this.get("errorMsg").set("message",value); // "message", is the attribute you want to update with the value 
     this.trigger('change:errorMsg'); // not sure if this is needed. but this will insure that this will trigger any event listeners on errorMsg 
    } 

}); 

App.SpecialDonationForm = App.DonationForm.extend({ 
    [...] 
    initialize: function(options){ 
     App.DonationForm.prototype.initialize.call(this, options); 
     [...] 
    }, 
    start: function(){ 
     App.DonationForm.prototype.start.call(this); 
     [...] 
     this.myPersonList = new App.PersonList(this.initialData); 
     this.myErrorMsg = new App.Errors(); 
     this.myPersonList.on('change:errorMsg',showError.bind(this)); 
     function showError(model,val,options){ 
      this.myErrorMsg.set(_.extend(this.myErrorMsg.defaults,model.toJSON()); 
     } 
     [...] 
+0

返信いただきありがとうございます。 "Uncaught ReferenceError:myErrorMsgが定義されていません" – Sapphireblue

+0

あなたのApp.PersonクラスにmyErrorMsgのインスタンスがありません – Hoyen

+0

私は質問をpared-downコードスニペットで更新します。 – Sapphireblue

0

このシナリオでは、イベントアグリゲータが動作する可能性があります。

App.eventAgg.trigger('someEvent'); 
0

答えるためにApp.PersonのMyMethodはでイベント

this.listenTo(App.eventAgg, 'someEvent', this.doSomeUpdate); 

listenTo App.Errors中に

App.eventAgg = _.extend({object}, Backbone.Events); 

が初期化バックボーンイベントを、拡張する

セットアップ、イベントをトリガあなたの一般的な質問はさらに一般的には、

  • Personオブジェクトは、Errorsオブジェクトについてはまったく分かりません。子オブジェクトは、その親について何も知らない(そして、そうすべきではない)。
  • Personオブジェクトは「エラー」が発生していることを知っていますが、誰かがそれについて知りたいと思うかもしれません(おそらく)。
  • Personオブジェクトはそれ以上のことを知らないので、カスタムイベントを引き起こすことができます。
  • このカスタムイベントをリッスンする必要があるオブジェクトもあります。あなたの階層に基づいて、Personオブジェクトにアクセスできる唯一の他のオブジェクトは、PersonListコレクションです。
  • PersonListコレクションは同じ状況になりました。それは、(カスタムイベントから)エラーが発生したことを知っていますが、それについては何もできず、その親についてもわかりません。だからこそ、別のカスタムイベントを引き起こすことができます。
  • DonationFormオブジェクトは、PersonListコレクションからカスタムイベントをリスンする必要があります。イベントを受信すると、オブジェクトをErrorsオブジェクトに渡すことができます。

Voila。

関連する問題