【问题标题】:Rails: Rendering a partial doesn't render the javascript code within itRails:渲染部分不会渲染其中的javascript代码
【发布时间】:2020-05-07 15:30:00
【问题描述】:

在我的 Rails 5 代码中,我有一个在成功返回 ajax 调用时加载的部分。这个部分有一个 div id,它用于由资产文件中的 ExtJS 代码加载的网格。 第一次加载页面时,所有的 UI 都被渲染得很好,包括 ExtJS 网格。但在那之后的任何时候,当 ajax 调用执行时,虽然部分加载,但网格不会加载。 除非重新加载整个页面,否则 Ext.onReady(function() 中的代码不会执行。 我该如何更改?

myapp/app/view/index.html.erb

<div id="test">                   
  <%= render partial: 'my_partial' %>
 </div> 

<script type="text/javascript">
  function someAjax(){
    $.ajax({
       url: '/mycontroller/my_data',                     
       success: function(result) {
          $('#test').html(result);          
        }                       
    }); 

  }  
</script>

myapp/app/view/_my_partial.html.erb

<li>                     
    <span>Some data </span><span><%= @value1 %></span> 
  </li>
<br>
<div>
  <div id="my-js-code"></div>
</div>

myapp/app/assets/javascript/my_grid_code.js.erb

Ext.Loader.setConfig({
    enabled: true,
    paths: {
        'Ext.ux': '/ext/ux'
    }
});

Ext.onReady(function(){
if(Ext.get('my-js-code')){
//code that creates a grid



Ext.define('mymodel', {
        extend: 'Ext.data.Model',
        fields: ['mycol1','mycol2']
    });
var store = Ext.create('Ext.data.Store', {
        autoLoad: true,
        model: 'mymodel',
        pageSize: 10,
        proxy: {
            type: 'rest',
            format: 'json',
            url: '/mycontroller/list',                
           reader: {
                type: 'json',
                root: ‘result’,
                totalProperty: 'totalCount'
        }
    }
});
    gridColumns = [{
            header: ‘My Col1’,            
            dataIndex: 'my_col1’        
    },{
            header: ‘My Col2’,
            dataIndex: 'my_col2’        
    }];

var grid = Ext.create('Ext.grid.Panel', {
            renderTo: 'my-js-code',
            store: store,                        
            columns: gridColumns
        });
});

myapp/app/controllers/my_controller.rb

def my_data
  respond_to do |format|
      format.html { render :partial => "my_partial" }  
  end 
end

【问题讨论】:

    标签: javascript ruby-on-rails extjs partials


    【解决方案1】:

    如果认为这是由可能只触发一次的 Ext.onReady 方法引起的。

    第二次,extJS 框架已经加载,因此回调不会被调用。

    一个简单的解决方法是通过 Ext.isReady 属性 (bool) 来检查它。

    文档:

    https://docs.sencha.com/extjs/6.2.0/classic/Ext.html#property-isReady https://docs.sencha.com/extjs/6.2.0/classic/Ext.html#method-onReady


    Ext.Loader.setConfig({
      enabled: true,
      paths: {
        'Ext.ux': '/ext/ux'
      }
    })
    
    var renderGrid = function (target) {
      if (Ext.get(target)) {
        var grid = Ext.create('Ext.grid.Panel', {
          renderTo: target,
          store: Ext.create('Ext.data.Store', {
            autoLoad: true,
            pageSize: 10,
            proxy: {
              type: 'rest',
              format: 'json',
              url: '/mycontroller/list',
              reader: {
                type: 'json',
                root: 'result',
                totalProperty: 'totalCount'
              }
            }
          }),
          columns: [
            {
              header: 'My Col1',
              dataIndex: 'my_col1'
            }, {
              header: 'My Col2',
              dataIndex: 'my_col2'
            }]
        })
      }
    }
    
    Ext.isReady ? renderGrid('my-js-code') : Ext.onReady(renderGrid('my-js-code'))
    

    【讨论】:

    • 你能告诉我如何使用 Ext.isReady 吗?比如我应该在哪里设置它以便在加载 Partial 时调用我的 js 代码?
    • 当然,我可以试试,我认为这不是您的 javascript 的全部部分,因为我找不到您定义 store 和 gridColumns 的位置。如果你能分享整个 js 部分,那会很有帮助。
    • 感谢您的帮助。但是如何将 Ext.isReady 设置为 true?当我的部分加载时,它仍然设置为 false。实际上,它似乎总是设置为false
    • 它是只读的,由框架维护,框架加载后会设置为true。这就是为什么如果它是假的,我们会等待它,使用带有回调的 Ext.onReady。一般来说,摆脱它可能会更好,我认为 Loader 定义应该只发生一次,以及检查框架是否已加载的部分。
    • 所以我最终从部分代码中删除了网格 div,而是将其添加到主索引中。从 ajax 成功我调用 Ext.getCmp('mygrid').getStore().load()
    最近更新 更多