【问题标题】:how to extend elixir phoenixframework html form helper如何扩展 elixir phoenixframework html 表单助手
【发布时间】:2016-03-19 05:48:14
【问题描述】:

我尝试扩展 phoenixframework 的 Phoenix.HTML.Form 模块。我的意图是包装 html 表单帮助器 text_input 来为 timex 日期值创建一个文本输入字段,以便与 bootstrap-datepicker 一起使用。

我是 elixir 新手,但我阅读了有关扩展 elixir 模块的协议。所以我尝试了:

defprotocol Phoenix.HTML.Form.Extension do
  def timex_date_input(form, field, opts \\ [])
end

defimpl Phoenix.HTML.Form.Extension, for: Phoenix.HTML.Form do
  def timex_date_input(%{model: model, params: params}, field, opts \\ []) do
    # my logic goes here
    form = %{model: model, params: params}
    text_input(form, field, opts)
  end
end

但是,它不起作用,因为:“function text_input/3 undefined”。什么是正确的解决方案?

【问题讨论】:

    标签: html forms helper elixir phoenix-framework


    【解决方案1】:

    您需要导入 Phoenix.HTML.Form 模块才能使用 text_input - 您会发现它已经导入到您的 web.ex 文件中的视图(以及您的模板,因为它们是视图中的函数) .

    如果你想添加一个新的表单函数,你可以简单地定义函数(不需要协议——这些通常被用作扩展库的一种方式——phoenix_ecto 就是一个很好的例子):

    defmodule MyApp.FormHelpers
      def timex_date_input(form, field, opts \\ [])   do
        # my logic goes here
        form = %{model: model, params: params}
        Phoenix.HTML.Form.text_input(form, field, opts)
      end
    

    然后您可以将其导入您的视图 (import MyApp.FormHelpers),或在模板中使用完整的函数名称:

    <%= timex_date_input(f, :date, ...) %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多