0

我有两个带有动作列的 netzke 网格组件(还有更多在路上)。操作列几乎相同,具体取决于类型。唯一的区别是单击操作按钮时要执行的操作。

所以我想要做的是定义一个新的网格组件,它具有所有共享部分,包括 javascript,然后在继承类中配置 javascript(设置参数/上下文)。

首先,我的课程如下所示:

class CpPoles < Netzke::Basepack::Grid
  include Netzke::Basepack::ActionColumn

  .. snipped ..    

  column :actions do |c|
    c.type = :action
    c.actions = [
        {name: :locate_on_map, tooltip: "show on map", icon: :map_marker},
    ]
  end

  js_configure do |c|
    c.on_locate_on_map = <<-JS
      function(record){
        Map.zoomToFeature('cp_poles', record.raw[0]);
      }
    JS
  end
end

在我的其他课程中,它看起来相同,除了 layer_name:

  js_configure do |c|
    c.on_locate_on_map = <<-JS
      function(record){
        Map.zoomToFeature('markerpoles', record.raw[0]);
      }
    JS
  end

所以我引入了一个新的网格类,它包含所有共享配置,并定义了动作:

  js_configure do |c|
    c.on_locate_on_map = <<-JS
      function(record){
        Map.zoomToFeature(this.layer_name, record.raw[0]);
      }
    JS
  end

现在我只需要设置this.layer_name. 我想很容易。在我的课堂CpPole上,我现在可以写作

class CpPoles < Netzke::MyApplication::Grid

  js_configure do |c|
    c.layer_name = 'cp_poles'
  end

end 

但这不起作用:(所以我尝试使用mixin,并在现场尝试initComponentthis.layer_name但这也不起作用。恐怕this我的共享网格中的 与this我的 CpPole 类中的不同,但on_locate_map确实有效.

我该如何解决这个问题?

4

1 回答 1

0

目前我以不同的方式解决了它,在我的基类中添加了一个方法

def self.set_action_methods(layer_name)
  js_configure do |c|
    c.on_locate_on_map = <<-JS
      function(record){
        Map.zoomToFeature('#{layer_name}', record.raw[0]);
      }
    JS
  end
end

它添加了所有操作方法(在我的代码中,它添加的不仅仅是一个)。

所以我的派生类变得非常简单,我只需要指定配置块

class Markerpoles < Netzke::MyBaseGrid

  def configure(c)
    super
    c.model = 'Markerpole'
    c.columns = [
        :name,
        {name: :location, flex: 1},
        {name: :comments, flex: 1},
        {name: 'markerpole_material__label', text: "Material"}
    ]
  end

  set_action_methods('markerpoles')
end

看起来很不错。不确定是否有更好的解决方案?

于 2013-11-26T09:27:46.950 回答