2015-02-19 2 views
0

Я разрабатываю приложение extjs и spring. Я застрял в визуализации в новой вкладке в центральной области области просмотра. Я не смог создать экземпляр представления, используя ref в контроллере. пожалуйста, помогите и дайте мне знать, где я делаю неправильно ..ExtJS 4 Render Errors on Viewport в новой вкладке

Controller js 
 

 
Ext.define('Book.controller.NewBook', { 
 
\t extend : 'Ext.app.Controller', 
 
\t \t views : ['book.NewBook'], 
 
\t refs : [ { 
 
\t \t ref : 'bookViewport', 
 
\t \t selector : 'viewport' //whatever the xtype is of your viewport class 
 
\t }, { ref : 'newBookForm', 
 
\t \t selector : '#newBook panel', 
 
\t \t autoCreate: true//whatever the xtype is of your viewport class 
 
\t } ], 
 

 
\t init : function() { 
 
\t \t // add the components and events we listen to 
 
\t \t this.control({ 
 
\t \t \t 'viewport > panel' : { 
 
\t \t \t \t render : this.onPanelRendered 
 
\t \t \t }, 
 
\t \t \t 'viewport' : { 
 
\t \t \t \t afterrender : this.onNewBookLinkClick 
 
\t \t \t \t } 
 
\t \t \t \t }); 
 
\t }, 
 
\t \t onNewBookLinkClick : function() { 
 
\t \t var view = this.getBookViewport(); 
 
\t \t var newBook = this.getNewBookForm(); 
 
\t \t alert(newBook.id); 
 

 
\t \t Ext.get('tab1').on('click', function() { 
 
\t \t \t \t var tabExists = false; 
 
\t \t \t \t var p1=Ext.getCmp('panel').getLayout(); 
 
\t \t \t \t var p2=Ext.getCmp('panel'); 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t 
 
\t \t \t \t \t \t var items = p2.items; 
 
\t \t \t \t \t \t for (var i = 0; i < items.length; i++) { 
 
\t \t \t \t \t \t \t alert(items[i].id); 
 
\t \t \t \t \t \t \t if (items[i].id === 'NewBook') { 
 
\t \t \t \t \t \t \t \t this.getViewport().panel.setActiveTab(i); 
 
\t \t \t \t \t \t \t \t tabExists = true; 
 
\t \t \t \t \t \t \t \t this.getViewport().panel.setActiveTab(i); 
 
\t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t \t if (!tabExists) { 
 
\t \t \t \t \t \t \t p2.insert(1, newBook); 
 
\t \t \t \t \t \t \t p2.setActiveTab(0); 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t }); 
 
\t \t \t \t }, 
 

 
\t \t \t 
 
\t \t 
 
\t onPanelRendered : function() { 
 
\t \t 
 
\t } 
 
}); 
 

 
View 
 
Ext.define('Book.view.book.NewBook', { 
 
extend : 'Ext.form.Panel', 
 
\t alias : 'widget.newBook', 
 

 
\t config: {}, 
 
    constructor: function (config) { 
 
     this.initConfig(config); 
 
     return this.callParent(arguments); 
 
    }, 
 
    
 
initComponent: function() { 
 
    Ext.apply(this, { 
 

 
\t layout : 'vbox', 
 
\t contentEl : 'center2', 
 
\t title : 'New Book', 
 
\t store : 'Books', 
 
\t id : 'NewBook', 
 
\t defaults : { 
 
\t \t bodyPadding : 10 
 
\t }, 
 
\t items : [ { 
 
\t \t xtype : 'panel', 
 
\t \t width : 900, 
 
\t \t collapsible : true, 
 
\t \t title : 'Book Details', 
 
\t \t defaults : { 
 
\t \t \t width : 230, 
 
\t \t \t cls : 'form-field' 
 
\t \t }, 
 
\t \t defaultType : 'textfield', 
 
\t \t items : [ { 
 
\t \t \t fieldLabel : 'Book Id', 
 
\t \t \t name : 'bookId', 
 
\t \t \t value : '', 
 
\t \t // validator : function(event) { 
 
\t \t // if (!(/[0-9]/.test(this.getValue()))) { 
 
\t \t // return "This Field should be in Numbers only"; 
 
\t \t // } 
 
\t \t // return true; 
 
\t \t // } 
 
\t \t } ] 
 
\t }] 
 

 
\t \t }); 
 
     this.callParent(arguments); 
 
    } 
 

 
}); 
 

 

 
ViewPort 
 

 
Ext.define('Book.view.Viewport', { 
 

 
\t 
 
\t extend: 'Ext.container.Viewport', 
 
\t \t alias : 'widget.viewport', 
 
\t requires: [ 
 
\t \t \t 'Book.view.book.catCombo', 
 
    \t \t \t 'Book.view.book.subCatCombo', 
 
       'Book.view.book.NewBook', 
 
\t \t \t \t 'Book.view.book.BookGrid', 
 
\t \t \t \t 'Book.view.book.SearchBook', 
 
      'Book.view.book.ModifyBook' 
 

 

 
\t   ], 
 
    id : 'borderViewPort', 
 
    layout : 'border', 
 
\t \t \t \t 
 
    items : [ 
 

 
     Ext.create('Ext.Component', { 
 
\t \t \t \t \t \t \t \t region : 'north', 
 
\t \t \t \t \t \t \t \t height : 0 
 

 
\t \t \t \t \t \t \t }), 
 
    { 
 
     region : 'west', 
 

 
     stateId : 'navigation-panel', 
 
     id : 'west-panel', 
 
     title : 'Navigation Menu', 
 
     split : true, 
 
     width : 200, 
 
     minWidth : 175, 
 
     maxWidth : 400, 
 
     collapsible : true, 
 
     animCollapse : true, 
 
     margins : '0 0 0 5', 
 
     layout : 'accordion', 
 
     items : [ { 
 
      contentEl : 'west', 
 
      title : '<b>Books</b>', 
 
      html :   '<div id="west" class="x-hide-display"><ul>   <li><a href="#" id="tab1" class="newBook">New Book</a></li>   <li><a href="#" class="searchBook">Search Book</a></li>  </ul></div>', 
 
      iconCls : 'nav' 
 
\t \t \t 
 
     }, { 
 
      title : 'Purchase Order', 
 
      iconCls : 'settings' 
 
     }, { 
 
      title : 'Total Sales', 
 
      iconCls : 'info' 
 
     } ] 
 
    }, 
 

 
    panel = Ext.create('Ext.tab.Panel', { 
 
     region : 'center', 
 
     id : 'panel', 
 
     deferredRender : false, 
 
     activeTab : 0 
 
    }) ] 
 
}); 
 

 
    
 
app.js 
 

 
Ext.application({ 
 
    name: 'Book', 
 
\t models: ['Book'], 
 
\t stores: ['Books','BookCategories','BookSubCategories'], 
 
\t controllers: ['NewBook', 'SearchBook'], 
 

 
    autoCreateViewport: true, 
 
    launch: function() { 
 
    \t Ext.create('Book.view.Viewport'); 
 

 
    } 
 
} 
 
);

ответ

0

Ваш центр области конфигурации неверен, так как вы определили его как переменную панели, но на самом деле не сделал это ребенок из элементы просмотра.

Вместо этого следует использовать этот подход:

new Ext.Viewport({ 
      layout: 'border', 
      items: [{ 
       region: 'north', 
       html: '<h1 class="x-panel-header">Page Title</h1>', 
       autoHeight: true, 
       border: false, 
       margins: '0 0 5 0' 
      },{ 
       region: 'west', 
       stateId : 'navigation-panel', 
       id : 'west-panel', 
       title : 'Navigation Menu', 
       split : true, 
       width : 200, 
       minWidth : 175, 
       maxWidth : 400, 
       collapsible : true, 
       animCollapse : true, 
       margins : '0 0 0 5', 
       layout : 'accordion', 
       items : [ { 
        contentEl : 'west', 
        title : '<b>Books</b>', 
        html :   '<div id="west" class="x-hide-display"><ul>   <li><a href="#" id="tab1" class="newBook">New Book</a></li>   <li><a href="#" class="searchBook">Search Book</a></li>  </ul></div>', 
        iconCls : 'nav' 

        }, { 
         title : 'Purchase Order', 
         iconCls : 'settings' 
        }, { 
         title : 'Total Sales', 
         iconCls : 'info' 
        }] 
        // the west region might typically utilize a TreePanel or a Panel with Accordion layout 
       },{ 
        region: 'center', 
        xtype: 'tabpanel', // TabPanel itself has no title 
        items: [{ 
         title: 'Tab 1' 
        },{ 
         title: 'Tab 2' 
        }] 
       }] 
      }); 

Это показывает правильно, вы должны увидеть, как вы можете адаптировать это к вашему определению вида.

+0

Спасибо за ответ. Проблема здесь в том, что я не получаю ссылку на мой newBook ​​view в контроллере, используя var newBook ​​= this.getNewBookForm(); \t \t alert (newBook.id); Идентификатор отображает некоторое значение компонента нежелательной почты, а не идентификатор моего представления «NewBook» –

+0

Попробуйте изменить свой селектор на просто-селектор: «#newBook» – mindparse

+0

Не повезло. он все еще не работает. Я попробовал много сочетаний, чтобы предоставить такие запросы компонентов, как «viewport> container> NewBook», «viewport> # center-region> NewBook», «viewport»> newBook ​​»,« viewport> # center-region> newBook ​​». ничего не работает. newBook.id - это всегда некоторый идентификатор компонента. –

0

Проблема решена путем удаления contentEl: 'center2', tag из моего представления NewBook. contentEl использует целевой элемент в качестве содержимого своего тела (панель все равно может быть передана любому другому элементу)

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