2012-06-16 1 views
0

я попытался создать базовый контроллер и написать в нем:ExtJS 4.1 Контроллер наследования с сгенерированных добытчиками для магазинов и моделей

Ext.define('My.Users.controller.Role', { 
    extend  : 'Ext.app.Controller', 
    stores  : [ 
     'Modules', 'ModulesList' 
    ], 
    models  : [ 
     'Modules', 'ModulesList' 
    ] 
}); 

Но когда я попытался использовать добытчиками для них (в этом базовом классе, или в его дочерние классы, такие как My.Users.controller.Group), например getModulesStore() или getModulesListModel(), у меня есть ошибка, что они не являются функциями. И в Firebug я вижу, что в этом классе нет таких методов и в суперклассе. Как я могу это исправить?

Полное описание, как воспроизвести эту ошибку: 1) Скачать ExtJS 4.1 GPL от Сенча

2) Распакуйте архив и перейдите в каталог ExtJS-4.1.0/примеры/приложение/загрузочном просмотра/

3) В файле feed-viewer.html строка комментариев <script type="text/javascript" src="all-classes.js"></script> для принудительной динамической загрузки js-файлов: теперь вы можете обычно редактировать содержимое файлов проекта.

4) В приложении папке/контроллер создать файл с именем Entities.js с помощью следующего кода:

Ext.define('FV.controller.Entities', { 
    extend: 'Ext.app.Controller', 
    models: ['Shared'], 
    stores: ['Shared'] 
}); 

5) В файлах Articles.js и Feeds.js изменяются распространяется на 'FV.controller.Entities'

6) В папках приложения/модели и приложение/магазин создавать файлы Shared.js с содержанием

Ext.define('FV.model.Shared', { 
    extend: 'Ext.data.Model', 
    idProperty: 'id', 
    fields: [ 
    { 
     name: 'id', 
     type: 'int' 
    }, 
    { 
     name: 'title', 
     type: 'string' 
    } 
    ] 
}); 

для модели и

Ext.define('FV.store.Shared', { 
    extend: 'Ext.data.Store', 
    model: 'FV.model.Shared', 
    proxy: { 
     type: 'ajax', 
     url: 'test.json', 
     reader: { 
      type: 'json', 
      root: 'item' 
     } 
    } 
}); 

для магазина.

7) Наконец, например, в методе init метода Article.js попробуйте console.log (this); В Firebug вы не получите методы getSharedModel() и getSharedStore().

Я загрузил свой образец в http://nekaka.com/d/W1_EOlnPST

+0

Ваш код выглядит правильно для меня, так что может быть несоответствие в имя/идентификатор магазина и модели, которую вы пытаетесь использовать. – JohnnyHK

ответ

1

models и stores КОНФИГУР свойства. Если вы посмотрите на источник Ext.app.Controller, вы увидите геттеры, созданные в конструкторе.

FV.controller.Articles, присущий вашему классу контроллера, но имеет свои собственные свойства models и stores, которые будут переопределять свойства в вашем базовом классе. Это очень похоже на то, как если бы ваш компонент имел конфигурацию height, он будет переопределять конфигурацию всех базовых классов (если базовый класс не заставляет такую ​​конфигурацию переопределять ее в конструкторе или initComponent, это не относится к controller, который использует простые config).

Если вы хотите, чтобы это работало, класс, присущий вашему контроллеру, должен будет явно слить конфигурацию базового класса с его новыми. Опять же, такие же, как с компонентами.

Альтернативно (и, вероятно, лучшее решение) вместо того, чтобы определять общие модели и сохранять в качестве свойств конфигурации в базовом классе, вы можете объединить их в конфигурацию, которую получает конструктор. Нечто подобное в конструкторе базового класса контроллера:

Ext.merge(config, { 
    models: ['Shared'], 
    stores: ['Shared'] 
}); 
+0

Парсер ест мой тег :) Я редактировал свой пост. Да, я даже не думаю о переопределении своих моделей и магазинов - я думаю, что это создаст геттеры, прежде чем он будет переопределен. Большое спасибо. –

2

Геттеры генерируются для представлений, если вы используете refs свойства.

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.app.Controller - ознакомьтесь с разделом «Использование ссылок».

Для магазинов просто использовать this.getStore('Modules')

+0

Я спросил о сгенерированных геттерах, а не о методах получения (entityName). –

+0

@GuyFawkes генерируемые геттеры называются get , они используются для извлечения представлений. Этот ответ правильный! Для моделей нет сгенерированных геттеров, они используются только для динамической загрузки. –

+0

@sha Для этого 'this.getStore ('Modules')' для работы вам нужно было бы создать его с этим id, иначе будет создан новый глобальный магазин с идентификатором 'Modules'. –