FineUI 官方论坛

标题: 实现关闭用户已经打开的标签! [打印本页]

作者: Vincent    时间: 2012-5-2 11:04
标题: 实现关闭用户已经打开的标签!
  首先谢一下,亭长先生的提示!{:soso_e144:},先说一下我为什么要实现这一的效果,
            因为我的项目左边的导航菜单式动态生成的,第一次进来的时候,加载满足条件的菜单,用户点击,然后相关标签在,右边的Main区域显示相关页面,然后用户点击搜索,左边菜单又不一样了,但是菜单里的每个选项是一样的,比如(man下面有tab1,tab2)因为之前第一次进来的时候,tab1,tab2用户已经打开了,如果现在再次点击的话,页面时不会有相应的,所以,只有在点击搜索的时候,就把用户上一次已经打开的标签都关闭掉。

好了原因说完,下面直接上代码,
  var mainTabStrip = Ext.getCmp('<%= mainTabStrip.ClientID %>');
                    var tabID = 'dynamic_added_tab' + node.id.replace('__', '-');
                    tabIdLists += tabID+",";
                    document.getElementById("tabIdArry").setAttribute("value", "" + tabIdLists + "");
                    mainTabStrip.addTab({
                        'id': tabID,
                        'url': href,
                        'title': node.parentNode.text + ' -> ' + node.text,
                        'closable': true,
                        'bodyStyle': 'padding:0;',
                        //'iconCls': 'icon_' + href.replace(/[^.]+\./, ''),
                        'tbar': new Ext.Toolbar({
                            items: ['->', openNewWindowButton, '-', refreshButton]
                        })
                    });
                }这里是动态添加标签,并且给标签的Id赋值的,tabIdList是申明的一个var变量,把每次打开的tabId给tablists,然后在把tablists给隐藏域tabIdArry,这样我们在后台就能获得用户已经打开的标签的Id了



下面后台的就简单了

string tabs = tabIdArry.Text;
            string [] tabIdArrys=tabs.Split(',');
            foreach (var tabid in tabIdArrys)
            {
                PageContext.RegisterStartupScript(mainTabStrip.GetRemoveTabReference(tabid));
            }
代码我就不分析了,大家都看得懂,
好了到此结束虽然不是什么鸟不起的分享,但毕竟是自己想办法解决的,所以想分享一下,望广大高手多多提意见。


作者: 张文相    时间: 2013-5-22 15:57
我可以发言么,给出客户端的实现 方式
作者: 张文相    时间: 2013-5-22 16:03
在DEAULT.JS中增加以下行

window.removeTab = function (id) {
        mainTabStrip.removeTab(id);
    };
    window.removeOtherTabs = function (id) {
        document.getElementById('tabIdArry').value.split(",").forEach(function (e) {
            if (e != id)
                mainTabStrip.removeTab(e);
        });

在DEFAULT.ASPX中增加

   <x:HiddenField  ID="tabIdArry" runat="server">
        </x:HiddenField>

同时增加全局变量
  var tabIdLists = '';

当然,最关键的,还要用FINEUI的源码,修改X.UTIL.JS,按楼主所说的增加两行代码,然后重新执行JS.BAT,再重新编译后更新项目引用(注意清除浏览器的缓存,否则JS可能不会重新加载)

最后服务器端调用方式如下:

//PageContext.RegisterStartupScript("parent.removeTab('dynamic_added_tabfindDevice');");
            PageContext.RegisterStartupScript("parent.removeOtherTabs('dynamic_added_tabfindDevice');");
            
客户端直接调用就不用说了吧

嗯,如果想让标签有编号,请在MENU.XML中为各节增加属性NodeID,如

<TreeNode NodeID="findDevice" Text="查找设备" NavigateUrl="~/deviceManager/findDevice.aspx">
    </TreeNode>
    <TreeNode NodeID="baseInfo" Text="基本信息" NavigateUrl="~/deviceManager/baseInfo.aspx" >
    </TreeNode>

最后强烈建议 FINEUI将此功能增加到代码中去(目前它只增加了移除功能,对ID没有记录,不过记不记录都无所谓,即使不修改X.UTIL.JS,也一样可以直接去遍历所有可能打开的ID(即使它实际没有打开),然后发出关闭指令)
作者: apoul    时间: 2013-5-24 15:20
看不懂是什么功能
作者: Min    时间: 2013-5-24 16:14
语言 描述能力太差~!  鉴定完毕 ,而且点击 搜索 为什么左侧的菜单会没有呢? 搜索不应该刷新整个界面才是




欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4