Рендеринг приложения ExtJS 4+ MVC в html div - как?

Все примеры, которые я нашел до сих пор, объясняют, как визуализировать приложение ExtJS (4.2) MVC в «области просмотра», что, другими словами, означает полный экран браузера и занимает все тело HTML.

Я хотел бы отобразить приложение на существующей HTML-странице с именем DIV, чтобы я мог иметь HTML-дизайн вокруг приложения.

 <div id="appdiv"><!-- application runs here --></div>

Я видел некоторые сайты с примерами ExtJS 4, которые используют трюк для отображения приложения ExtJS на странице с помощью IFRAME.

Можно ли избежать IFRAME? И если да, то как будет выглядеть скелет приложения ExtJS 4.2, если он будет отображаться в div.

Примечания: в ExtJS 3 я нашел решение, создав панель в качестве основного контейнера, который отображается в именованном div. Однако версия 4.2 (и, возможно, более ранние версии 4.x) предлагает подход к применению MVC, который кажется намного лучше.

---- Правки

Я понял, что я должен поставить отправные точки для этого вопроса.

  1. Исходный код для этого примера создается с помощью команды CMD ExtJS, которая создает скелет каркаса «приложения».
  2. Каркас приложения состоит из множества файлов, включая ссылку на движок и другие ссылки, поэтому я не смог бы включить сюда все источники в каталоге/папке «приложения». Каркас приложения можно сделать с помощью cmd в моде: sencha -sdk /myuserroot/Sencha/Cmd/3.1.1.274 generate app ExtGenApp /mywebroot/htdocs/extja_genapp Генерирует файлы и папки и копирует все нужные файлы на место.
  3. Область активности «Пользователь» находится в каталоге «приложение». Каталог приложений имеет подкаталоги для представлений, контроллеров, моделей и прочего.
  4. Как и во многих других фреймворках, вы должны сохранить структуру папок, чтобы фреймворк мог найти подходящие файлы и инициализировать их.
  5. список файлов:

index.html (в корне сгенерированного приложения)

    <!DOCTYPE HTML>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>ExtGenApp</title>
        <!-- <x-compile> -->
            <!-- <x-bootstrap> -->
                <link rel="stylesheet" href="bootstrap.css">
                <script src="ext/ext-dev.js"></script>
                <script src="bootstrap.js"></script>
            <!-- </x-bootstrap> -->
            <script src="app/app.js"></script>
        <!-- </x-compile> -->
    </head>
    <body>
        <h1>HTML Before</h1>
        <div id="appBox"></div>
        <h1>HTML After</h1>
    </body>
    </html>

приложение/app.js

    /*
        This file is generated and updated by Sencha Cmd. You can edit this file as
        needed for your application, but these edits will have to be merged by
        Sencha Cmd when it performs code generation tasks such as generating new
        models, controllers or views and when running "sencha app upgrade".

        Ideally changes to this file would be limited and most work would be done
        in other places (such as Controllers). If Sencha Cmd cannot merge your
        changes and its generated code, it will produce a "merge conflict" that you
        will need to resolve manually.
    */

    // DO NOT DELETE - this directive is required for Sencha Cmd packages to work.
    //@require @packageOverrides



    Ext.application({
        name: 'ExtGenApp',

        views: [
            'Main',
            'appBoxView'
        ],

        controllers: [
            'Main'
        ],

        launch: function() {
            new Ext.view.appBoxView({
                renderTo: 'appBox'
            });;  // generates error      
        }
    });

примечание: изначально нет функции запуска, но есть автоматически генерируемое окно просмотра (по умолчанию это генератор)

приложение/контроллер/Main.js

    Ext.define('ExtGenApp.controller.Main', {
        extend: 'Ext.app.Controller'
    });

приложение/представление/appBoxView.js

    Ext.define('ExtGenApp.view.appBoxView', {
        extend: 'Ext.panel.Panel',

        requires:[
            'Ext.tab.Panel',
            'Ext.layout.container.Border'
        ],

        layout: {
            type: 'border'
        },

        items: [{
            region: 'west',
            xtype: 'panel',
            title: 'west',
            width: 150
        },{
            region: 'center',
            xtype: 'tabpanel',
            items:[{
                title: 'Center Tab 1'
            }]
        }]
    });

это должно быть начальное расположение на экране (AFAIK)

и наконец:

приложение/представление/Main.js

    Ext.define("ExtGenApp.view.Main", {
        extend: 'Ext.Component',
        html: 'Hello, World!!'
    });

что должно, как я понял, быть "содержанием".

как есть, он генерирует ошибку, связанную с отсутствием «Ext.view.appBoxView», и, как мне кажется, фреймворк не инициализирует приложение.


person ljgww    schedule 22.05.2013    source источник
comment
Re: Мередит, к сожалению, из-за сочетания сомнительного внешнего лицензирования (для коммерческого продукта) и в то же время этих первоначальных препятствий проект, для которого было предпринято это исследование, был запущен другим путем, так что, честно говоря, у меня не было многого тем временем, чтобы оценить ответы. Я планирую оценить и закрыть этот вопрос, если это достаточно ясно. В то же время я хотел бы также попросить совета у администраторов, так как этот вопрос, похоже, был сгенерирован самоуверенными ответами и может раскрыть более интересные идеи о структуре EXT.js MVC, возможно, еще какое-то время оставаться открытым ???   -  person ljgww    schedule 30.06.2014
comment
Также в то же время я начал верить, что авторы Ext.Js не предполагали использование этой структуры в способе, который я описал. Создание приложения для работы в полноразмерном браузере не входит в первоначальную идею проектов по интеграции ext.js в более крупную систему.   -  person ljgww    schedule 30.06.2014
comment
??? Не уверен, что я сказал в своем комментарии (делал ли я когда-нибудь его в прошлом году?), Но я давно отказался от использования ExtJS. В итоге я использовал его как полностраничную структуру приложения, а не только один компонент сетки, как предполагалось дизайнерами. В некоторых плагинах группировки была ошибка, если сетка использовалась не таким образом.   -  person Meredith    schedule 30.06.2014


Ответы (4)


Окно просмотра — это просто специализированный Ext.container.Container, размер которого автоматически соответствует телу документа.

Таким образом, вы можете легко создать свой собственный метод запуска:

launch: function(){
    new MyContainer({
        renderTo: 'myDiv'
    });
}
person Evan Trimboli    schedule 22.05.2013
comment
да, именно так это можно сделать в ExtJS 3. Но приложение ExtJS4 MVC состоит из представлений и области просмотра с автоматическим рендерингом. Пробовал это, и он говорит мне, что MyContainer не определен, как я могу сослаться на него в «представлении»? - person ljgww; 22.05.2013
comment
Автоматический рендеринг области просмотра в основном делает именно то, что я указал выше. Объявите собственное представление MyApp.view.Container так же, как вы объявляете окно просмотра. Требуйте его в своих представлениях, а затем создайте его, как я предложил выше. - person Evan Trimboli; 22.05.2013
comment
все еще не мог понять, как создать экземпляр основного контейнера, но, поскольку представления определены в другом месте, мне кажется, что я буду использовать метод Ext.Create при запуске, здесь есть некоторое обсуждение sencha.com/forum/, но до сих пор нет рабочего рецепта. - person ljgww; 26.05.2013
comment
Единственная разница между create/new заключается в том, что create будет искать любые незавершенные зависимости, а new — нет. Я не совсем уверен, как объяснить дальше, при запуске вы создаете экземпляр своего контейнерного компонента. - person Evan Trimboli; 26.05.2013
comment
Соберу набор источников в попытке ответить, не видя другого способа объяснить, в чем может быть проблема. Это терпит неудачу где-то между структурой и определениями. - person ljgww; 27.05.2013

В некоторых из этих ответов некоторые предлагают использовать Ext.Panel с renderTo. Вы не должны использовать Ext.Panel, если вы не собираетесь использовать его для чего-либо, кроме контейнера, если вы собираетесь идти по этому пути. Вместо этого вы должны использовать Ext.container.Container.

Используя Ext.Panel, вы добавляете к своему компоненту кучу ненужных вещей, таких как строка заголовка и тому подобное. Каждый из них добавляет туда дополнительные заполнители, даже если вы их не используете.

person radtad    schedule 12.07.2013

Мне понравился краткий подход Эвана Тримболи, но я тоже не смог заставить его работать (он также сказал мне, что MyContainer не определен). Однако этот подход сработал...

launch: function () {    
    Ext.create('widget.MyContainer', {
        renderTo: 'MyDiv'
    });
}

... где 'widget.MyContainer' — это псевдоним, созданный внутри самого представления, и при условии, что я также сделал это сверху:

Ext.define('MyApp.Application', {
    extend: 'Ext.app.Application',

    name: 'MyApp',

    views: [
        'MyApp.view.MyContainer'
    ],
...
person Dylan    schedule 17.06.2014
comment
MyContainer было просто именем, которое я придумал, нет встроенного класса с таким названием. - person Evan Trimboli; 18.06.2014
comment
Правильно, я создал класс (так же, как я сделал для моего примера выше). Но даже когда я делаю это и ссылаюсь на него в приложении, я не могу сделать new MyContainer без того, чтобы не сказать «не определено». Я что-то пропустил? - person Dylan; 18.06.2014
comment
Ваш класс MyApp.view.MyContainer. - person Evan Trimboli; 18.06.2014
comment
Интересный. Я предполагал, что он увидит/использует псевдоним. Итак, используя этот подход, я вижу, что он не требует включения в представления выше. Суть в том, что существует несколько способов создания экземпляра. Но есть ли что-то, что вы могли бы предложить в качестве лучшей практики? - person Dylan; 18.06.2014

Вы пробовали использовать Ext.panel.Panel или Ext.window.Window в качестве контейнера?

<div id="appBox">
<script type="text/javascript">  

Ext.require('Ext.panel.Panel');
        Ext.onReady(function(){

            Ext.create('Ext.panel.Panel', {
                renderTo: Ext.getBody(),
                width: 400,
                height: 300,
                title: 'Container Panel',
                items: [
                    {
                        xtype: 'panel',
                        title: 'Child Panel 1',
                        height: 100,
                        width: '75%'
                    },
                    {
                        xtype: 'panel',
                        title: 'Child Panel 2',
                        height: 100,
                        width: '75%'
                    }
                ]
            });


        })

    </script>
</div>
person user1964663    schedule 25.06.2013