ExtJS: Quel est le point de besoin?
J'ai été à essayer de comprendre ce qu'implique le fait dans Ext JS 4, et je n'arrive pas à trouver une réponse raisonnable. Disons que j'ai le code suivant:
app.js
Ext.Loader.setConfig({
enabled: true
});
Ext.Loader.setPath('Ext.ux', 'examples/ux');
Ext.application({
name: 'Test',
appFolder: 'app',
controllers: ['TheController'],
requires: ['Test.Utils', 'Test.Utils2'], //I don't think this does anything... couldn't find this option for Ext.application
launch: function() {
Ext.create('Ext.Viewport', {
layout: 'border',
items: [{
xtype: 'thegrid',
region: 'center',
title: 'blah!'
}]
});
}
});
app/controller/TheController.js
Ext.define('Test.controller.TheController', {
extend: 'Ext.app.Controller',
models: ['TheModel'],
stores: ['TheStore'],
views: ['TheGrid'],
init: function() {
}
});
app/view/TheGrid.js
Ext.define('Test.view.TheGrid', {
extend: 'Ext.grid.Panel',
alias: 'widget.thegrid',
requires: ['Test.store.TheStore'],
store: 'TheStore',
columns: [
{header: 'Name', dataIndex: 'name'},
{header: 'Phone', dataIndex: 'phone'},
{header: 'Hello', dataIndex: 'hello'}
]
});
app/store/TheStore.js
Ext.define('Test.store.TheStore', {
extend: 'Ext.data.Store',
requires: ['Test.model.TheModel', 'Test.Utils'],
model: 'Test.model.TheModel',
data: [
{name: 'keanu reeves', phone: '1800matrices', hello: Test.Utils.getText()},
{name: 'james earl jones', phone: '1800starwar', hello: 'nothing here'},
{name: 'barack obama', phone: '1800prsidnt', hello: 'hello world'}
]
});
app/model/TheModel.js
Ext.define('Test.model.TheModel', {
extend: 'Ext.data.Model',
fields: [
{name: 'name', type: 'string'},
{name: 'phone', type: 'string'},
{name: 'hello', type: 'string'}
]
});
app/Utils.js
Ext.define('Test.Utils', {
singleton: true,
requires: ['Test.Utils2'],
getText: function() {
return Test.Utils2.hello + 'world';
}
});
app/Utils2.js
Ext.define('Test.Utils2', {
singleton: true,
hello: 'hello'
});
Je réalise que c'est un bon exemple, mais j'avais besoin de m'assurer pleinement dépeint ce que je faisais. Utils s'appuie sur Utils2 parce qu'il a besoin de faire appel Utils2 hello variable. Le reste du code est mise en place d'une grille et de l'appel de la Utils.getText fonction dans TheStore. Firebug jette un Test.Utils is undefined
sur la ligne 6 en TheStore.js et, à ce point dans le temps, de Test.Utils, évidemment, n'existe pas, mais de Test.Utils2 n'.
Ma question est... pourquoi ne Utils2 existent, mais Utils ne l'est pas? Je pensais que nécessite introduit dans les classes que j'avais besoin, me permettant ainsi de les utiliser, mais je suppose que je me trompe. J'ai lu le Sencha docs et une multitude de fils, mais rien n'a vraiment de sens, et il n'a pas vraiment expliquer cet exemple. Quelqu'un peut-il apporter un aperçu ici? Je l'apprécierais.
**Aussi, je me rends compte que je suis en train de faire certaines choses stupides ici, mais c'est simplement pour un exemple, donc je ne suis pas à la recherche d'associer le global Utils ou de ne pas utiliser des variables globales à tous... je suis juste essayer de comprendre la nécessite de l'option.
Mise à JOUR
Grâce à Izhaki la réponse ci-dessous, j'ai pensé à quelque chose. Si je veux utiliser une classe dans une classe, je suis la définition, j'aurais à attendre pour que l'objet créé (c'est à dire, utiliser initComponent), donc mon magasin et de la grille des modifications au code:
app/store/TheStore.js
Ext.define('Test.store.TheStore', {
extend: 'Ext.data.Store',
requires: ['Test.model.TheModel'],
model: 'Test.model.TheModel'
});
app/view/TheGrid.js
Ext.define('Test.view.TheGrid', {
extend: 'Ext.grid.Panel',
alias: 'widget.thegrid',
requires: ['Test.store.TheStore'],
store: 'TheStore',
columns: [
{header: 'Name', dataIndex: 'name'},
{header: 'Phone', dataIndex: 'phone'},
{header: 'Hello', dataIndex: 'hello'}
],
//This is the change that works
initComponent: function() {
this.callParent();
this.store.loadData([
{name: 'keanu reeves', phone: '1800matrices', hello: Test.Utils.getText()},
{name: 'james earl jones', phone: '1800starwar', hello: 'nothing here'},
{name: 'barack obama', phone: '1800prsidnt', hello: 'hello world'}
]);
}
});
Cela fonctionne, mais ma dernière question est... dois-je avoir l'exige pour TheModel dans TheStore, et/ou TheStore dans TheGrid? Il semble que TheController est de prendre soin de tous ceux requiert parce que je peux utiliser de Test.Utils dans TheGrid, mais TheGrid n'est pas spécifiquement qu'il exige de Test.Utils.
Aussi, cet exemple de la Sencha docs me rend encore plus perplexe, parce que je suis clairement pas à l'aide de Test.Utils jusqu'à TheStore est créé, mais cet exemple me semble qu'il peut utiliser la classe Enfant sans avoir à attendre pour initialiser (à l'aide de initComponent).
Vous devez vous connecter pour publier un commentaire.
Ce n'est effectivement pas une question stupide à tous.
Vous pouvez regarder nécessite aussi une façon de dire ExtJS:
"Lorsque vous construisez un objet de cette classe, assurez-vous de charger dynamiquement les scripts requis d'abord".
Vous avez raison sur cette ligne:
ne pas être nécessaire dans
app.js
, la raison en est que l'application a déjà:qui est la même chose que de dire vous avez besoin de la js script dans lequel
TheController
réside (n'importe quel modèle/vue/contrôleur/magasin définition signifie également que les scripts sont nécessaires, c'est à dire sera chargé dynamiquement).TheController
a:qui va les charger dynamiquement c'est pourquoi le même
requires
n'est pas nécessaire, ilapp.js
;La raison pour laquelle vous obtenez Firebug jeter
Test.Utils
est pas défini, c'est que vous donnez une config (hello
) avec une référence à un objet qui n'est pas encore chargé dynamiquement - il n'y a pasTest.Utils
dans le champ d'application jusqu'à ce queTheStore
est construit.HasMany relations n'ont tout simplement pas fonctionner sans elle,
Il aide JSBuilder savoir quels sont les fichiers à inclure. Par exemple, si votre Fenêtre d'affichage utilise la frontière de disposition, elle, à tort, de ne pas être inclus, et vous devez les utiliser utilise ou nécessite de l'inclure.