【问题标题】:Getting to parameters wrong number获取参数错误的数字
【发布时间】:2012-01-09 21:38:42
【问题描述】:

无法将 javascript 变量传递给 http 获取请求。以下是获取 select 标签值并将其传递给 coffeescript 中的请求的代码块:

jQuery(document).ready ->
    mktuClassID = $("#mktu_class").val();

    $("#mktu_class").change getClassID = ->
        mktuClassID = $(this).val()

    $("#registration_application_items").tokenInput("/items/" + mktuClassID, {
        crossDomain: false,
        prePopulate: $("#registration_application_items").data("pre"),
        preventDuplicates: true,
        theme: "facebook"
    })

它总是在 mktuClassID 变量中发送相同的值,但是,我看到我的值在 console.log() 中发生了变化,但它总是在 tokenInput 方法中传递相同的值。 这是日志:

Processing by MktuItemsController#token_inputs as JSON
Parameters: {"q"=>"2", "class_id"=>"3"}
MktuItem Load (0.7ms)  SELECT "mktu_items".* FROM "mktu_items" WHERE (name like '%2%' AND mktu_class_id = '3')

请帮助我,我应该如何重新排列我的代码以使其正常工作?

【问题讨论】:

标签: javascript jquery ruby-on-rails coffeescript


【解决方案1】:

您的 ready 处理程序做了三件事:

  1. 获取#mktu_class 的当前值并将其存储在mktuClassID 中。
  2. 将更改处理程序绑定到#mktu_class,将其值存储在mktuClassID 中。
  3. 使用 URL 为 "/items/" + mktuClassID 调用 tokenInput,其中 mktuClassID 是 (1) 中的值。

结果是您在#mktu_class 上的更改处理程序没有做任何有用的事情,对#mktu_class 的任何更改都将被忽略(好吧,它们最终会出现在mktuClassID 但不会看到mktuClassID所以效果是一样的)。也许您的缩进已关闭,您真的希望 /items 调用位于更改处理程序中:

jQuery(document).ready ->
    mktuClassID = $("#mktu_class").val();

    $("#mktu_class").change getClassID = ->
        mktuClassID = $(this).val()
        $("#registration_application_items").tokenInput("/items/" + mktuClassID, {
            crossDomain: false,
            prePopulate: $("#registration_application_items").data("pre"),
            preventDuplicates: true,
            theme: "facebook"
        })

如果是这样,那么完全取消 mktuClassID 并添加一个 $('#mktu_class').change() 调用来初始化事物:

jQuery(document).ready ->
    $('#mktu_class').change ->
        mktuClassID = $(this).val()
        $('#registration_application_items').tokenInput('/items/' + encodeURIComponent(mktuClassID), {
            crossDomain: false,
            prePopulate: $('#registration_application_items').data('pre'),
            preventDuplicates: true,
            theme: 'facebook'
        })
    $('#mktu_class').change();

当你把 mktuClassID 放在 URL 中时,你真的应该很偏执并编码它,所以我也添加了一个 encodeURIComponent 调用。

如果您只想在#mktu_class 第一次更改时调用tokenInput,则将更改处理程序与one 绑定:

jQuery(document).ready ->
    $('#mktu_class').one 'change', ->
        mktuClassID = $(this).val()
        $('#registration_application_items').tokenInput('/items/' + encodeURIComponent(mktuClassID), {
            crossDomain: false,
            prePopulate: $('#registration_application_items').data('pre'),
            preventDuplicates: true,
            theme: 'facebook'
        })

该版本只会在#mktu_class 首次更改时调用tokenInput

【讨论】:

  • 我已经尝试过您建议的代码。它做了这件事,mktuClassID 变量得到了正确的值,但我遇到了另一个问题。问题是 tokenInput 方法在我的 DOM 中放置了一个输入字段,并且每次更改处理程序工作时都会这样做。
  • @Dastan:我不知道tokenInput 应该做什么。您需要在每次#mktu_class 更改时调用tokenInput 还是只调用一次?
  • @Dastan:那你为什么要绑定一个变更处理程序?如果您只想拨打tokenInput 一次,那么您当前的代码如何不起作用?您是没有正确初始化#mktu_class,还是只想在第一次更改时调用tokenInput
  • 我调用更改处理程序来获取#mktu_class 的当前值以将其传递给tokenInput。我以为 mktuClassID 变量会在 tokenInput 方法中更改处理程序后获得实际值,但事实并非如此。
  • 我找到了解决问题的方法。这是github.com/loopj/jquery-tokeninput/pull/77。我们可以在 source 中传递三个参数:它可以是任何本地数据、URL 或动态调用的函数,并且应该返回一个 url 字符串。它解决了问题。非常感谢 @mu 太短了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2012-06-16
  • 2022-12-07
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多