当前位置: 首页 > 知识库问答 >
问题:

如何过滤依赖于网格或表单中其他组合框的组合框(netzke)?

陆阳曜
2023-03-14

领域模型:类型1、类型2、类型3和工厂。

$ rails g model type1 name:string
$ rails g model type2 name:string
$ rails g model type3 type1:references type2:references name:string
$ rails g model plant type1:references type2:references type3:references name:string

在植物的网格面板中,将有三个组合框列:类型1,类型2和类型3。类型 3 取决于类型 1 和类型 2。当选择类型1和类型2中的任何一个时,如何过滤类型3组合框?

共有1个答案

殳自怡
2023-03-14

我是Rails和Netzke的新手,但这就是我解决问题的方式。

首先,如果Type3依赖于Type1和Type2,那么在植物中只应该引用Type3。

所以,而不是

rails g model plant type1:references type2:references type3:references name:string

使用

rails g model plant type3:references name:string

您可以使用Netzke的__(双下划线)符号来引用type1和type2。这是我的植物网格版本。我不允许内联编辑,除了大多数琐碎的模型。

class Plants < Netzke::Basepack::Grid
  def configure(c)
    super
    c.model = 'Plant'
    c.persistence = true
    c.columns = [
      { name: :type3__type1__name, header: 'Type 1'},
      { name: :type3__type2__name, header: 'Type 2'},
      { name: :type3__name, header: 'Type 3'},
      { name: :name, header: 'Plant Name' }
    ]
    c.enable_edit_inline = false
    c.enable_add_inline = false
  end

  def preconfigure_record_window(c)
    super
    c.form_config.klass = PlantForm
  end
end

要连接组合框,您需要:

> < li>

定义type3组合的范围,以便其数据依赖于type1和type2 IDs。

#Example scope definition
scope: {type1_id: component_session[:type1_id],
        type2_id: component_session[:type2_id]}

为type1和type2组合定义侦听器(请参见< code>js_configure方法)。侦听器将检测type1和type2中的任何变化,并准备type3在下次被选中时刷新其数据。

endpoint和会话变量用于ID交换。

//JavaScript code
//Definition of listener function for type1 combo
var handleType1Change = function() {

  //Type3 value is no longer valid
  type3Combo.clearValue();

  //Setting lastQuer to null will force data refresh for type3 combo
  //next time it gets selected.
  type3Combo.lastQuery = null;

  //Call endpoint to define session variable with ID of type1 combo
  this.selectType1({type1_id: type1Combo.value});
};

#Ruby code
#The endpoint is called from handleType1Chnage listener to
#set session variable with selected ID in type1 combo.
endpoint :select_type1 do |params, this|
  component_session[:type1_id] = params[:type1_id]
end

这是我的植物形式的完整代码:

class PlantForm< Netzke::Basepack::Form
  def configure(c)
    super
    c.model = 'Plant'
    c.title = 'Plant'
    c.items = [
      {
        field_label: 'Type1',
        xtype: :combo,
        store: Type1.select([:id, :name]).map { |x| [x.id, x.name] },
        id: 'type1Combo',
        #Sets the value for type1 in case change form is opened
        value: record && record.id ? record.type3.type1_id : nil
      },
      {
        field_label: 'Type2',
        xtype: :combo,
        store: Type2.select([:id, :name]).map { |x| [x.id, x.name] },
        id: 'type2Combo',
        #Sets the value for type2 in case change form is opened
        value: record && record.id ? record.type3.type2_id : nil
      },
      { 
        field_label: 'Type3', 
        name: :type3__name,
        id: 'type3Combo',
        data_store: {auto_load: false},
        scope: {type1_id: component_session[:type1_id],
                type2_id: component_session[:type2_id]}
      },
      { field_label: 'Name', name: :name }
    ]
  end

  js_configure do |c|
    c.init_component = <<-JS
      function() {
        this.callParent();

        var type1Combo = this.getComponent('type1Combo');
        var type2Combo = this.getComponent('type2Combo');
        var type3Combo = this.getComponent('type3Combo');

        var handleType1Change = function() {
          type3Combo.clearValue();
          type3Combo.lastQuery = null; //force data refresh in type3 combo
          this.selectType1({type1_id: type1Combo.value});
        };

        var handleType2Change = function() {
          type3Combo.clearValue();
          type3Combo.lastQuery = null;
          this.selectType2({type2_id: type2Combo.value});
        };

        type1Combo.addListener('select', handleType1Change, this);
        type2Combo.addListener('select', handleType2Change, this);
      }
    JS
  end

  endpoint :select_type1 do |params, this|
    component_session[:type1_id] = params[:type1_id]
  end

  endpoint :select_type2 do |params, this|
    component_session[:type2_id] = params[:type2_id]
  end

end
 类似资料:
  • 我想要一个组合框,它会在用户键入时过滤列表项。它应该如下工作: 键入时,文本字段应该显示一个可能的选择,但是用户尚未键入的单词部分应该突出显示。 当他打开列表时,下拉框应该只显示可能的选项? 使用箭头键,用户应该在缩小可能的项目后选择剩余的项目之一。 过滤并不重要,跳转到第一个匹配的选择也可以。 有类似的吗?

  • 主要内容:硬编码组合框实例,由映射生成组合框实例,组合框内部项以下部分介绍如何从JSF创建HTML组合框。标签呈现大小未指定的“”类型的HTML输入元素。 以下JSF标签 - 被渲染成以下HTML代码 - 硬编码组合框实例 以下是文件:index.xhtml 中的代码 - 以下是文件:result.xhtml 中的代码 - 以下是文件:UserBean.java 中的代码 - 由映射生成组合框实例 以下是文件:UserBean.java 中的代码 - 以下是

  • Ext-js为Grid store内置了一个名为filter的函数,该函数用组合框中的选定值过滤网格结果。 我想要反过来。它应过滤除所选数据之外的网格数据。 示例:默认情况下,首先选中“全部”复选框。当我取消选中任何复选框时,网格应该显示除所选复选框之外的数据。 请查找筛选选项的屏幕截图 下面是我尝试过的代码,但是它确实过滤了选中复选框的网格。 如果有人对此有任何建议,请告诉我。

  • 我有一个简单的可编辑的JComboBox,当您键入时,它过滤可用的选择。除了一些奇怪的情况外,它几乎可以工作,例如,当你键入“Sass”时,它将可用的选择过滤到一个“Sassi di Matera”,但如果你选择它,它将选择“Arte ruprestre della Vacamonica”,它碰巧是原始模型的第[0]项,而不是过滤后的模型的第[0]项。 我试着调试了几个小时,但似乎是一些奇怪的up

  • 主要内容:Listbox控件,Combobox控件列表框(Listbox)和复选框(Combobox)是 Tkinter 中两个控件,由于其非常相似,本节将它们放在一起进行介绍。 Listbox控件 首先介绍一下列表框,即 Listbox。在使用 Tkinter 进行 GUI 编程的过程中,如果需要用户自己进行选择时就可以使用列表框控件。列表框中的选项可以是多个条目,也可以是单个唯一条目,但常用于多个条目。 下面对列表框控件(Listbox)的常

  • 问题内容: 我有一个发布功能,如下所示: 现在假设在某些时候对Projects进行了更改,结果是上面返回了一个不同的项目,因此Tasks.find将返回其他任务。但是,对项目所做的更改不会重新发布 任务 我已经使用了reactPublish,但事实证明该程序包存在问题(并且也没有任何单元测试)。因此,是否有一种简单的方法可以在项目更改时重新发布此发布功能? 问题答案: 通过调用安装软件包。 添加软