2012-07-14 175 views
1

我對單個頁面站點使用Backbone.js,Require.js和Underscore.js。如何知道骨幹視圖模板何時完成呈現?

我有一個處理的交換進出的子視圖的容器圖。

對於我的子視圖之一,我需要在HTML模板的渲染完畢就知道了。這裏的原因:我的子視圖(view_subview.html)HTML模板包含iframe和形式:

<iframe name="myIFrame" id="myIFrame"></iframe> 

<form action="http://myendpt.com/do" method="get" id="myForm" target="myIFrame"> 
    <input type="hidden" name="param1" value="value1"/> 
</form> 

通過提交表單,以顯示在myendpt.com/do將處理生成內容iframe。

我想弄清楚事情的時機,這樣一旦被加載,我可以提交表單。

我的子視圖看起來是這樣的:

define([ 
    'jQuery', 
    'Underscore', 
    'Backbone', 
    'config', 
    'text!templates/view_subview.html' 
], function ($, _, Backbone, Config, tpl) { 
    var SubView = Backbone.View.extend({ 

     template: _.template(tpl), 

     initialize: function() { 
     }, 

     render: function (eventName) { 
      $(this.el).html(this.template({config: Config})); 
      $('#myForm').submit(); 
      return this; 
     }, 
    }); 
    return SubView; 
}); 

的$( '#myForm的')提交()調用渲染()實際上並沒有提交表單。大概這是因爲HTML仍在加載並且文檔尚未準備好。

如果我移動$(「#myForm的」)。提交()叫出我的容器視圖,我可以讓它工作,但我想子視圖自己的提交表單的。我的容器視圖(和其他不相關的子視圖)不需要知道或關心在SubView中發生的情況。

了哪些子視圖(並且僅在子視圖),以檢測到HTML滿載,這樣我可以調用提交的最佳方式?

+0

我發現東西的作品,但我不知道這是最好的答案。我發現Underscore.js的延遲()函數: 呈現:功能(eventName的){$ (this.el)的.html(this.template({配置:配置,字符串:字符串})); (函數(){$('#imsForm')。submit();}); 返回此; }, 根據文檔,defer()「延遲調用函數,直到當前調用棧已經清除」。 這似乎是推遲了我足夠,以便我可以調用提交,但它會始終做伎倆?有沒有更適合我的問題的解決方案? – user1524807 2012-07-14 00:45:34

回答

1

爲什麼不在你的iframe加載並準備好時觸發一個事件?你的渲染函數可以綁定到該事件;一些單獨的線:

render: function(eventName){ 
    $(this.el).html(this.template({config:Config}) 
     .bind('formReady',function(){ 
      $('#myForm',this.el).submit(); 
     }) 
    return this; 
} 

和,只是讓你的iframe的觸發事件的onload:

<iframe onload='$(this).trigger('formReady');' .... >