【问题标题】:ExtJs button's menu contents not rendered until button is clickedExtJs 按钮的菜单内容在单击按钮之前不会呈现
【发布时间】:2013-12-31 10:57:01
【问题描述】:

我有一个带菜单的简单按钮。菜单中有一个树形面板。

每当用户选择树中的某个节点时,我都会更新容器按钮文本。

在 treepanel 的 afterrender 事件中,我在树中进行了默认节点选择,并且此触发选择事件和按钮的文本被更新。

但是,当第一次渲染按钮时,菜单内的树形面板还没有渲染。

如何在按钮被渲染后让菜单和树形面板静默渲染(添加到 dom 但在单击按钮之前不向用户显示)?

实际上有一个我犹豫使用的解决方法:

btn.showMenu(); 
btn.hideMenu();

有更好的想法吗?

JsFiddle: http://jsfiddle.net/exGk3/

代码:

var selectedNodeIndex = 1;

var onItemSelect = function (selModel, node, index) {
    var treePanel = selModel.view.up();
    var btn = treePanel.up("button");
    btn.setText(node.data.text);
};

var afterTreeRender = function (t) {
    t.selModel.select(selectedNodeIndex);
}

Ext.create('Ext.Button', {
    text: 'Click me',
    renderTo: Ext.getBody(),
    menu: {
        items: {
            xtype: "treepanel",
            id: "tree",
            indent: false,
            width: 150,
            height: 200,
            rootVisible: false,
            root: {
                children: [{
                    text: "item 1",
                    leaf: true
                }, {
                    text: "item 2",
                    leaf: true
                }, {
                    text: "item 3",
                    leaf: true
                }]
            },
            listeners: {
                select: {
                    fn: onItemSelect
                },
                afterrender: {
                    fn: afterTreeRender
                }
            }
        },
        showSeparator: false
    }
});

【问题讨论】:

    标签: button extjs menu


    【解决方案1】:

    我认为这里最简单的做法是传递按钮所需的文本。似乎您已经知道要在树中选择哪个节点,那么您可能知道哪个文本对应于所选索引。

    如果这无法实现或 API 不可更改,您可以通过以下方式以编程方式设置按钮文本: http://jsfiddle.net/dbrin/XSn7X/3/

    您所做的更改是 2 倍:

    1. 使用Ext.define 方法通过initComponent 方法定义您的类。 initComponet 方法是在构造函数之后设置附加属性的钩子。这里的关键是此时类的实例存在,*this* 上下文引用了类实例。
    2. 使用 Ext.create 创建自定义按钮组件的实例。

    initComponment 方法中,您只需遍历树以查找您需要的数据并设置按钮文本。

    【讨论】:

    • 您好,感谢您的回复。实际上我需要的不仅仅是设置按钮的文本。渲染时间按钮时,我需要访问/操作树的属性(例如 tree.selModel)。问题是,树没有被渲染,因此在按钮创建时无法正确访问。你需要一个额外的 btn.menuShow() 来渲染树。
    • 我不确定你的意思,树属性在按钮创建时可用。您可以在按钮的 initComponent 内移动树形面板的创建和存储。在那里你可以设置任何你想要的树配置属性。您需要设置哪些具体属性?
    • tree.selModel.getSelection() 在渲染树之前返回一个空数组。
    • 那是因为没有物理选择。为什么需要等待物理选择?您拥有选定的节点索引,您可以通过相同的索引从存储中获取数据。这就是我在小提琴中为你所做的。
    • 好吧,即使我尝试以编程方式进行选择(在树的添加事件上)它仍然返回一个空数组。
    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 2015-01-21
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多