令牌输入仅在我刷新页面后才有效

Posted

技术标签:

【中文标题】令牌输入仅在我刷新页面后才有效【英文标题】:Token Input only works once i refresh the page 【发布时间】:2014-05-14 03:59:16 【问题描述】:

所以当我第一次进入使用 TokenInput 的页面时,tokeninput 永远不会点击我的输入表单。只有在我刷新页面后它才能工作。为什么会这样?当我最初访问该页面时,如何让它发挥作用?

当我第一次访问我的页面时。查看玩家领域。

一旦我刷新

我猜 javascript 出了点问题。调查该问题后,似乎整个页面都加载了日期字段和复选框的正确数据。在我刷新正确的数据后,我的令牌输入中应该出现正确的数据,但我的复选框和日期的值不正确。

日期和复选框值属于另一个名册。

应用程序.html

<%= stylesheet_link_tag    "application", "token-input-facebook", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "jquery-tokeninput", "data-turbolinks-track" => true %>

应用程序.js

//= require jquery
//= require jquery_ujs
//= require bootsy
//= require turbolinks
//= require_tree .
//= require twitter/bootstrap
//= require jquery_nested_form

);

$(function() 
  $("#roster_player_tokens").tokenInput("/players.json", 
    crossDomain: false,
    prePopulate: $("#roster_player_tokens").data("pre"),
    theme: "facebook",
    propertyToSearch: "gamertag",
    hintText: "Type in a gamertag",
    searchingText: "Searching...",
    tokenLimit: 4,
    preventDuplicates: true
  );
);

我的名单表格

<%= form_for([@team, @roster]) do |f| %>
  <% if @roster.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@roster.errors.count, "error") %> prohibited this roster from being saved:</h2>
      <ul>
      <% @roster.errors.full_messages.each do |msg| %><li><%= msg %></li><% end %>
      </ul>
    </div>
  <% end %>
  <form role="form">

    <%= f.label :current %><br>
    <%= f.check_box :current %><br>

    <%= f.label :start %><br>
    <%= f.date_select :start %><br>

    <%= f.label :end %><br>
    <%= f.date_select :end, :include_blank => true, :default => nil %><br>

  <%= f.label :player_tokens, "Players" %><br />
  <%= f.text_field :player_tokens, "data-pre" => @roster.players.map(&:attributes).to_json %><br>

  <%= f.submit :class => "btn btn-warning" %>
  </form>

<% end %>

【问题讨论】:

我完全没有使用 Rails 的经验,所以这可能无关紧要,但如果这是普通的 jQuery,那么 $.tokenInput() 函数需要包装在 $(document).ready() 中。 (如果 rails 自动执行此操作,那么这是没有用的 - 但认为值得一提。) 感谢我使用了您的示例并将我的脚本放在我的 html 文件中而不是 application.js 中,现在效果更好。因此,在第一页加载时,玩家字段和所有其他字段都是正确的。当我刷新玩家字段时是相同的(它应该,但现在其他字段更改为我之前查看的名册字段。无论如何你可以做出答案,我会接受它。谢谢 你能解释清楚吗?一个页面上是否有多个这样的表单?他们都使用相同的html ID吗?那会破坏事情... 澄清一下:“但现在其他字段更改为我之前查看的名册字段”是您失去我的地方! 你在我的图片中看到的是整个页面,它们使用相同的 ID,但是当我从一个名册转到另一个名册并刷新时,我得到的数据在刷新后不正确(只有球员字段是一样的)。我认为这是因为在 rails 4 中引入的 turbo-links,我现在正在看这个问题。 ***.com/questions/18770517/… 【参考方案1】:

如果这是普通的 jQuery,那么 $.tokenInput() 函数需要被包裹在 $(document).ready() 中。

我不是 Rails 用户,但在这里也应该做类似的事情。 OP 表示他“将 [the] 脚本放在 [the] html 文件中,而不是 application.js”,这完成了这项工作。

【讨论】:

【参考方案2】:

当我将我的 JavaScript 代码放入 HTML 页面时,@Chris 是正确的,底部令牌输入每次都有效。

我的 ruby​​ on rails slim _form.html.slim

.form-group.row
    .offset-sm-2.col-sm-10
      = f.submit class:'btn btn-primary pull-right', value: t('event.createevent_l')

javascript:
  $(function() 
    $('#event_friend_tokens').tokenInput('/friends.json', 
      crossDomain: false,
      prePopulate: $('#event_friend_tokens').data('pre'),
      theme: 'facebook',
      preventDuplicates: true,
      minChars: 2,
      tokenLimit: 10
    );
  );

【讨论】:

以上是关于令牌输入仅在我刷新页面后才有效的主要内容,如果未能解决你的问题,请参考以下文章

仅在刷新页面时令牌过期时注销?为啥?

在刷新重定向页面时丢失访问令牌

React JS 仅在我刷新页面时读取道具数据

DataTables 仅在页面刷新时加载

Coffeescript JQuery on click 仅在页面刷新时有效

React 应用程序网站页面仅在刷新时加载