2012-07-14 81 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');' .... >