2015-10-23 11 views
11

私はバックボーンが比較的新しく、この問題を抱えています。これは、以下の私の部分であるindex.dust最新のモデルを表示していないバックボーン部分図

<div id="parentView"> 
    <div class="section"> 
    {>"app/inc/responseMessage" /} 
    <div class="userDetails"> 
     {! A button to get user details !} 
    </div> 
    </div> 
</div> 

- -

私はDustJSとバックボーンを使用していますが

マイテンプレートは、次のようになりますresponseMessage.dust私のJSがこの

ようになります

<div id="responseMessage"> 
    {@eq key="{data.success}" value="true"} 
    <div class="alert alert-success success" role="alert">success</div> 
    {/eq} 
</div> 

initialize: function() { 
    this.responseMessageView = this.responseMessageView || 
     new ResponseMessageView({ 
      model: new Backbone.Model() 
     }); // View is for the partial 
    this.model = this.model || new Backbone.Model(); //View for the whole page 
}, 

以下の関数は、イベントが発生したときに呼び出され、POSTを実行して正常に戻ります。コールバック関数

exports.sendEmail = function sendEmail(req, res){ 
    req.model.data.success = true; 
    responseRender.handleResponse(null, req, res); 
}; 

this.model

primaryViewEventTrigger: function(event){ 
    //Button click on `index.dust` triggers this event and does a POST event to the backend 

    this.listenToOnce(this.model, 'sync', this.primaryViewSuccess);//this will render the whole view. 
    this.listenToOnce(this.model, 'error', this.primaryViewError); 
    this.model.save({data: {x:'123'}}); 
} 

responseViewEventTrigger: function(event){ 
    //Button click on `responseMessage.dust` triggers this event and does a POST event to the backend 

    this.listenToOnce(this.responseMessageView.model, 'sync', this.responseViewSuccess);//it should only render the partial view - responseMessage.dust 
    this.listenToOnce(this.responseMessageView.model, 'error', this.primaryViewError); 
    this.responseMessageView.model.save({data: {x:'123'}}); 
} 
primaryViewSuccess: function(model,response){ 
    this.model.set('data', response.data); 
    this.render(); 
} 
responseViewSuccess: function(model,response){ 
    this.responseMessageView.model.set('data', response.data); 
    console.log(this.responseMessageView.model); 
    this.responseMessageView.render(); // Does not work in some cases 
} 

私の実装では、ページ全体のモデルに属しています。一方、部分的なモデルはthis.responseMessageView.modelです。

質問:ほとんどの場合、これは完全に正常に機能します。部分モデルを最新のモデル値でレンダリングしないケースが1つあります。ボタンをクリックすると、index.dustprimaryViewSuccessが実行されます。その後、別のボタンをクリックしてresponseViewEventTriggerをトリガーします。それは正常にPOSTを行い、responseViewSuccessに来て、それもモデルに格納します。しかし、それはフロントエンドには表示されません。 data.successは依然として真ではありませんが、console.log(this.responseMessageView.model)はそれを示しています。attributes->data->success = true

しかし、私がページをリフレッシュすると同じ動作がすべて完璧です。そのちょうどprimaryViewSuccessが呼び出されたときにresponseViewSuccessが呼び出されたときに最新のモデルの変更が反映されません。 つまり、モデルは更新されていますが、DOMは同じままです。

私はここで何が欠けていますか?御時間ありがとうございます!

+0

あなたが意図的に 'responseMessageView'に新しいモデルを渡しているか、あなたが同じになるように、このコード内を参照しているモデルを期待しています..?あなたは 'this.model.set( 'data'、response.data);' 'this.responseMessageView.model.set( 'data'、response.data);'などを実行しているようで、混乱のように見えます...最初のコードブロックで 'initialize'を含んでいる*ものが何であるか分かりません... 2番目のコードブロックを含む*ものは何か分かりません。これらの間の関係を説明したいかもしれませんビュー、モデルなど最初に –

+0

@tj私は質問を編集しました。私はあなたが何を意味するのか理解していないのですか? initialize()は、ページ全体と部分的なビューを宣言するために使用されます。私は自分自身をよく説明できない場合は申し訳ありません。 –

+0

*物事*私はそれがビュー、コレクションなどであるかどうかを尋ねていました。あなたが "* primaryViewSuccessが呼び出された後、responseViewSuccessが最新のモデル変更をしていないということを意味していませんでした。ビューはどのモデルを変更していません..? 2つのビューと2つのモデルがあります。それに基づいて、誰に基づいて更新すべきかを説明してください。 –

答えて

5

あなたは、インデックスビューをレンダリングするときに、すべてのDOMノードのを置き換えます。これには、responseMessageViewインスタンスが関連付けられているDOMノードが含まれます。 responseMessageView.elを調べると、実際に新しいモデルデータで更新されていることがわかりますが、要素はインデックスのDOMツリーにはもう接続されません。

ここ
var Parent = Backbone.View.extend({ 
    template: _.template(''), 
    render: function() { 
    this.$el.html(this.template()); 
    }, 

    initialize: function() { 
    this.render(); 
    this.child = new Child(); 
    this.$el.append(child.el); 
    } 
}); 

手動でのレンダリングを呼び出し、child.elは、もはや(あなたはインスペクタを使用して確認できます) parent.elになることはありません。

ここで最も簡単な修正は、新しくレンダリングされたdiv#responseMessage要素を持つ親レンダリングの後にchild.setElementを呼び出すことです。より良い修正は、事前にresponseMessageViewの要素を切り離し、そして後に再接続することです。

var Parent = Backbone.View.extend({ 
    render: function() { 
    this.responseMessageView.$el.detach(); 
    this.$el.html(this.template(this.model.toJSON())); 
    this.$el.find('#responseMessage').replaceWith(this.responseMessageView.el); 
    } 
}); 
+0

これは絶対に意味があります。しかし、私はDustJSを使っているので、これは私にとってはうまくいきません:/ /私はこれを行います$ el.html(this.model.toJSON())); '親ビューは最新のモデルを表示しません変更。 htmlはモデルの変更を表示しません。 –

3

てみ成功コールバックを使用して、私はあなたの問題はここから来るかもしれないと思う知らせる:

this.model.save({ATT1: "値"}、{成功:handler1、エラー:handler2}) ;

また、listenToOnceを使用しますか? listenToの代わりに??

+0

これはうまくいかない。私の関数はこの 'this.responseMessageView.model.save({data:{email:emailAddress.val()}});)のようになります..' ..また、成功コールバックが確実に呼び出されていることに言及しておきます。私はそれにコンソールステートメントを持っている。 –

+0

私はこれを試しました 'this.responseMessageView.model.save({data:{email:emailAddress.val()}}、{success:this.responseViewSuccess、error:this.responseViewError});' ..これは動作しません: (私は何が欠けていますか? –

+0

私はlistenToを行いましたが、まだ役に立たない:/ –

関連する問題