0

我想在树面板中添加一个自定义对象作为树节点。它将被用作

var complex_object = {....}
myTree.getRootNode().appendChild(new MyNode(complex_object));

为了实现这样的功能,我发现Ext.data.NodeInterface它为树节点提供了一个通用接口。所以我试图扩展它。这是它的完成方式。

var MYNS = {
       TreeNode: new Ext.Class({
        protocol : "",
        displayName : "",
        extend: 'Ext.data.NodeInterface',
        constructor : function(line) {
            this.protocol = get_protocol(line);
            this.displayName = get_display_name(line);
            var configObj = {
                id : this.protocol + "-" + this.displayName,
                text : this.displayName,
                leaf : true,
                iconCls : protocol+"-user"
            };
            this.callParent([configObj]);
        }
    })
}

事实证明,这不会创建任何扩展类Ext.data.NodeInterface. 但是,它创建的对象 bud 无法从其父项中发挥作用。

 var a = new MYNS.TreeNode(...);
 a.appendChild(); // throws error

我做错了吗?如何正确地做到这一点?

4

1 回答 1

3

Ext.data.NodeInterfaceExt.data.Model是一个“工厂”,用于用所需的属性/功能装饰类的原型。

此类用作一组方法,应用于模型的原型,以使用 Node API 来装饰它。这意味着与树一起使用的模型将具有模型上可用的所有与树相关的方法。

这是你将如何使用它:

Ext.define('app.MyModel', {
    extend: 'Ext.data.Model',

    fields: [ /*...*/ ],

    /*...*/
});

Ext.data.NodeInterface.decorate('app.MyModel'); // String will be resolved to Class object internally

var obj = Ext.ModelManager.create(parent, 'app.MyModel');
obj.appendChild(/*...*/);

中心方法是Ext.data.NodeInterface#decorate- 请参阅文档- 它在内部促进#getPrototypeBody。这些都是静态方法。您可以覆盖getPrototypeBody以操纵类定义。对于其他 Ext 类来获取更改,您宁愿重写 Ext.data.NodeInterface而不是扩展它。

但是,另一种方法是通过扩展Ext.data.Model来添加所需的功能- 这实际上可能是满足您要求的更直接的方法。

于 2012-09-13T16:55:48.740 回答