2013-05-22 2 views
6

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

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

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

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

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

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

---- редактирует

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

  1. Источник для этого примера генерируется командой CMD от ExtJS, которая генерирует каркас каркаса приложения.
  2. Скелет приложения состоит из множества файлов, включая ссылку на двигатель, и другие ссылки, поэтому я не смог бы включить сюда все источники в папку «application» dir /. Скелет приложения можно сделать с помощью cmd в моду: sencha -sdk /myuserroot/Sencha/Cmd/3.1.1.274 generate app ExtGenApp /mywebroot/htdocs/extja_genapp Это создает файлы и папки и копирует все необходимые файлы на место.
  3. Область действия "Пользователь" находится в директории "app". В приложении dir есть поддиры для просмотров, контроллеров, моделей и дополнительных материалов.
  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)

и, наконец:

app/view/Main.js

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

, который должен, как я понял, быть «контентом».

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

+0

Re: Meredith, к сожалению, из-за комбинации сомнительного внешнего лицензирования (для коммерческого продукта), и в то же время эти начальные препятствия, проект, для которого было проведено это исследование, получил новый путь, так что, честно говоря, я не имел большого количества времени, тем временем, чтобы оценить ответы , Я планирую оценить и закрыть этот вопрос, если это достаточно ясно. В то же время я бы попросил также руководство от админов, поскольку этот вопрос, похоже, вызвал упрямые ответы и может показать более интересные сведения о структуре EXT.js MVC, возможно, еще некоторое время оставаться открытым? – ljgww

+0

Также я начал думать, что авторы Ext.Js не предполагали использовать эту структуру в моде, который я описал. Создание приложения для работы в полноразмерном браузере исключает первоначальную идею проекта ext.js в большую систему. – ljgww

+1

??? Не уверен, что я сказал в своем комментарии (если я когда-либо делал это в прошлом году?), Но я уже давно перешел от использования ExtJS. В итоге я использовал его как полностраничную инфраструктуру приложения, а не только один компонент сетки, как планировали его дизайнеры. В некоторых плагинах группировки была ошибка, если сетка не использовалась таким образом. – Meredith

ответ

3

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

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

launch: function(){ 
    new MyContainer({ 
     renderTo: 'myDiv' 
    }); 
} 
+0

Да, это так, как это можно сделать в ExtJS 3. Но приложение ExtJS4 MVC состоит из просмотров и окна рендеринга автоматического рендеринга. Пробовал это, и он говорит мне, что MyContainer не определен, как я могу ссылаться на «представление»? – ljgww

+0

Автоматический рендеринг области просмотра в основном делает именно то, что у меня выше. Объявите свое собственное представление 'MyApp.view.Container' в Точно так же вы объявляете окно просмотра. Требовать его в своих представлениях, а затем создавать его, как я предложил выше. –

+0

все еще не мог понять, как создать экземпляр основного контейнера, но поскольку представления определены в другом месте, мне кажется, что я буду использовать Ext. Создайте метод в запуске, здесь есть обсуждение здесь: http://www.sencha.com/forum/showthread.php?127671-Ext.create-vs-the-keyword-new, но до сих пор нет рабочего рецепта. – ljgww

0

Вы пытались использовать 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> 
1

Вам необходимо использовать другой контейнер, чем Ext.container.Viewport. Определением Ext.container.Viewport всегда будет отображаться все окно браузера.

Из документации:

The Viewport renders itself to the document body, and automatically sizes itself to the size of the browser viewport and manages window resizing. There may only be one Viewport created in a page. 

Просто используйте Ext.panel.Panel вместо

см ниже образца.

Ext.application({ 
    name: 'HelloExt', 
    launch: function() { 
     Ext.create('Ext.panel.Panel', { 
      layout: 'fit', 
      renderTo: Ext.get('content') 
      items: [ 
       { 
        title: 'Hello Ext', 
        html : 'Hello! Welcome to Ext JS.' 
       } 
      ] 
     }); 
    } 
}); 

также см ниже ссылке

http://www.sencha.com/forum/showthread.php?141964-Render-an-ExtJs-4-application-in-a-div http://css.dzone.com/articles/height-problem-when-rendering

+0

Благодарим вас за эти предложения. Я отметил несколько намеков, представленных на форуме, например. используя .create вместо .define, а также autoCreateViewPort: false - нужно поместить их в микс и повторите попытку. – ljgww

+0

Okay @ljgww .... Всегда следует, какой API предлагает и как дизайн рамки. Посмотрите на sencha doc, чтобы понять лучше. Всего наилучшего. – Hariharan

1

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

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

1

Мне понравился сжатый подход Эвана Тримболи, но я не мог заставить его работать (он также сказал мне, что 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' 
    ], 
... 
+0

'MyContainer' был просто именем, которое я написал, нет встроенного класса, который называется. –

+0

Правильно, я создал класс (так же, как и для моего примера выше). Но даже когда вы делаете это и ссылаетесь на него в приложении, я не мог бы сделать «новый MyContainer» без него, говоря «не определено». Я что-то пропустил? – Dylan

+1

Ваш класс 'MyApp.view.MyContainer'. –

Смежные вопросы