TreePanel: почему я должен использовать Ext.crete для инициализации магазина?

В определении панели дерева я хотел бы написать (как я обычно делаю с панелями сетки):

store: 'MyStore'

Но это работает только с

store: Ext.create('MyStore')

В первом случае у меня ошибка при пропаже магазина. Кажется, работает только второй вариант. Это доставляет мне много хлопот в дизайне MVC, и я хотел бы избежать этого. Мой вопрос: есть ли способ установить магазин, как в первом варианте? Это выглядит странно, потому что для панели сетки это назначение магазина работает правильно.

Вот полный код:

<html>
<head>

    <link rel="stylesheet" type="text/css" href="ext/packages/ext-theme-classic/build/resources/ext-theme-classic-all.css" />
    <script type="text/javascript" src="ext/ext-all-debug.js"></script>
</head>
<body>

    <script type="text/javascript">
        Ext.onReady(function () {

            try {

                //define model
                Ext.define('MyDataModel', {
                    extend: 'Ext.data.Model',

                    fields: [
                        { name: 'nodename', mapping: 'nodename' }
                    ],

                });

                //define store
                Ext.define('MyStore', {
                    extend: 'Ext.data.TreeStore',

                    storeId: 'idStoreLryManager',
                    model: 'MyDataModel',

                    root: {
                        nodename: 'myRoot',
                        expanded: true
                    },

                    proxy: {
                        type: 'ajax',
                        url: 'test_lrymgr.json',
                        reader: {
                            type: 'json',
                            root: 'data',
                            metaProperty: 'metadata',
                            totalProperty: 'metadata.totalCount',
                            successProperty: 'metadata.success',
                            messageProperty: 'metadata.msg'
                        },
                    }
                });

                //define tree panel
                Ext.define('MyTreePanel', {
                    extend: 'Ext.tree.Panel',
                    alias: 'widget.myTreePanel',

                    store: Ext.create('MyStore'),

                    rootVisible: true,

                    columns: [
                        {
                            xtype: 'treecolumn',
                            dataIndex: 'nodename',
                            sortable: false,
                            flex: 2,
                            header: ''
                        }
                    ]
                });


                //create tree view
                Ext.createWidget('window', {
                    title: 'test',
                    layout: 'fit',
                    autoShow: true,
                    height: 360,
                    width: 200,
                    items: {
                        xtype: 'myTreePanel',
                        border: false
                    }
                });

            }
            catch (ex) {
                Ext.Msg.alert("", ex)
            }
        });



    </script>
</body>
</html>

И здесь JSON:

{   
    "data": [   
        {
            "nodename": "AAA",
            "isvisible": true,
            "expanded": false,
            "leaf": false,
            "data": [
                {
                    "nodename": "BBB.1",
                    "isvisible": true,
                    "expanded": false,
                    "leaf": true
                },              
                {
                    "nodename": "BBB.2",
                    "isvisible": false,
                    "expanded": false,
                    "leaf": true
                }
            ]          
        },
        {
            "nodename": "BBB",
            "isvisible": true,
            "expanded": false,
            "leaf": true
        }           
    ],
    "metadata": { "success":true, "msg":"", "totalCount":1, "totalPages":1, "prevLink":"", "nextLink":""}   
}

1 ответ

Если вы используете MVC, и вы перечислите магазин в stores:[] массив приложения или контроллера, то Ext создает хранилище для вас и регистрирует его в StoreManager, Затем вы можете использовать строку с storeId в панели дерева.

Например:

// in Application.js
stores:['MyStore']

// in tree config
store:'MyStore'

работает.

Однако приведенный выше код обходит MVC, так что вам нужно явно создать хранилище с помощью Ext.create

Другие вопросы по тегам