加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用Twitter Bootstrap和Cocoon的Tab链接的唯

发布时间:2020-12-17 02:33:42 所属栏目:百科 来源:网络整理
导读:我有一个 Ruby on Rails应用程序,部分使用Twitter Bootstrap选项卡,用户可以使用Simple Form和Cocoon添加该部分的多个实例. 为了使标签链接正常工作,我必须为部分的每个新子项中的选项卡指定唯一的名称(以便单击特定选项卡激活其自己的唯一内容,而不是内容为
我有一个 Ruby on Rails应用程序,部分使用Twitter Bootstrap选项卡,用户可以使用Simple Form和Cocoon添加该部分的多个实例.

为了使标签链接正常工作,我必须为部分的每个新子项中的选项卡指定唯一的名称(以便单击特定选项卡激活其自己的唯一内容,而不是内容为同名的选项卡前面的孩子部分出现在同一页面上).

我看到代码已添加到Cocoon中以实现此目标:https://github.com/nathanvda/cocoon/pull/100.

在该讨论中,有迹象表明在Cocoon Simple Form Demo项目中尝试了新功能.但是在尝试新功能的过程中所做的任何改变都没有在那里进行(至少就我所知).

查看github上的提交,通过在’insertionNode.trigger’调用(https://github.com/woto/cocoon/commit/cb206d501e4749a05e0c1d868911da159c8200c1)上的参数中添加'[contentNode]’,可以在Cocoon javascript代码中完成添加:

insertionNode.trigger('cocoon:before-insert',[contentNode]);

我对这些东西不太熟练.

那么,如何为嵌套子项的每个新实例实现/获取唯一标识符?

任何帮助或方向将不胜感激.

以下是我的申请中的代码供参考:

– #/ app/controllers/parent_records_controller.rb

class ParentRecordsController < ApplicationController

  # GET /parent_records/1/edit
  def edit
    @parent_record = ParentRecord.find(params[:id])
    @parent_record.items.build
  end
end

– #/应用/视图/ parent_records / _form.html.haml

.row-fluid
  =simple_form_for(@parent_record,:wrapper => :inline4,:html => {:class => 'form-inline',:multipart => true}) do |f|
    .row-fluid
      = f.simple_fields_for :items do |item|
        =render :partial => '/parent_records/form_partials/item',:locals => { :f => item }
      .row
        .span2.offset9
          = link_to_add_association 'Add Another Item',f,:items,:class => 'btn btn-primary',:partial =>     'parent_records/form_partials/item'
    = f.button :submit,:class => 'btn btn-success'

– #/ app / views / parent_records / form_partials / _item —— TAB HREF NAME是我需要的唯一标识符——

.nested-fields
  .well.span
    .tabbable
      %ul.nav.nav-tabs
        %li.active
          %a{"data-toggle" => "tab",:href => "#tab1"} Item Info 
        %li
          %a{"data-toggle" => "tab",:href => "#tab2"} Pictures

      .tab-content
        #tab1.tab-pane.active
          = f.input :short_name,:label => 'Item Title'
          = f.input :brand,:label => 'Brand'
          = f.input :description,:label => 'Description' 

        #tab2.tab-pane
          = f.simple_fields_for :pictures do |picture|
            =render :partial => '/parent_record/form_partials/picture',:locals => { :f => picture }
          .span2.offset9
            = link_to_add_association 'Add A Picture',:pictures,:partial =>     'parent_records/form_partials/picture'
      .span2
        = link_to_remove_association "Remove Item",:class => 'btn btn-danger'

– #/应用/视图/ parent_records / form_partials / _picture

.nested-fields  
  .well.span
    = f.input :image,:label => 'Seclect Image to be Uploaded'
    = f.input :rank,:label => 'Image Rank for this Item'
    .row
      .span2
        = link_to_remove_association "Remove Picture",:class => 'btn btn-danger'

编辑/后续问题:

下面的Nathan的答案用于添加唯一标识符,但添加唯一标识符已经破坏了Bootstrap的标签功能.这似乎有些道理,因为我的印象是Bootstrap javascript可能只是在文档最初加载时评估选项卡和链接之间的对应关系.

谁能指出我如何让??Bootstrap javascript重新初始化并找到新的ID和链接?

EDIT2

结果(我认为)是div .well.span将.nested-fields和.tabbable分开,这阻止了Bootstrap能够初始化新命名的href和tab id.疯狂的旅程,但最终令人满意.

解决方法

首先,在 cocoon_simple_form_demo项目中,您将看到最后一次提交使用cocoon:before-insert或cocoon:after-insert事件添加动画.

after_insert事件为您提供了插入的DOM元素,因此您可以使用它执行任何操作,例如:填写一个独特的href.

所以在你的情况下,这将是类似下面的内容(注意:完全未经测试的代码,但我希望它能让你前进):

$('form').bind('cocoon:before-insert',function(e,item_to_be_added) {
    new_id = new Date().getTime();
    item_to_be_added.find('a[href="#tab1"]').attr('href',"#tab1_" + new_id);
    item_to_be_added.find('#tab1').attr('id',"tab1_" + new_id);
    // do the same for #tab2
});

这只是标准的jquery DOM操作.希望这可以帮助.

您可以在插入后重新触发选项卡行为(这需要在插入后,其他方面没有用):

$('form').bind('cocoon:after-insert',item_to_be_added) {
       $('nav-tabs a').click(function(e) {
         e.preventDefault();
         $(this).tab('show');
       }); 
   });

你应该有这样的代码吗?另一种选择是使用更好的on,如下所示:

$('form').on 'click','.nav-tabs a',function(e) {
    e.preventDefault(); 
    $(this).tab('show');
});

这应该只在页面加载时完成一次,并且在添加选项卡时将继续工作.

HTH.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读