Re-insertion d'un Enregistrement dans un Magasin extJS
Le code
Ext.onReady(
function() {
Ext.QuickTips.init();
Ext.namespace('TimeTracker');
TimeTracker.dataStore = new Ext.data.JsonStore(
{
root: 'timecardEntries',
url: 'php/scripts/timecardEntry.script.php',
storeId: 'timesheet',
autoLoad: true,
autoSave: true,
writer: new Ext.data.JsonWriter(
{
encode: true
}
),
fields: [
{name: 'id', type: 'integer'},
{name: 'user_id', type: 'integer'},
{name: 'ticket_id', type: 'integer'},
{name: 'description', type: 'string'},
{name: 'start_time', type: 'date', dateFormat: 'Y-m-d H:i:s'},
{name: 'stop_time', type: 'date', dateFormat: 'Y-m-d H:i:s'},
{name: 'client_id', type: 'integer'},
{name: 'is_billable', type: 'integer'}
]
}
);
TimeTracker.timeEntryGrid = new Ext.grid.EditorGridPanel(
{
renderTo: Ext.getBody(),
store: TimeTracker.dataStore,
autoFit: true,
height: 500,
title: 'Timesheet Entries',
tbar: [
{
xtype: 'button',
text: 'Add Record',
iconCls: 'silk-add',
handler: function() {
var timecardEntry = TimeTracker.timeEntryGrid.getStore().recordType;
var tce = new timecardEntry(
{
description: 'New Timesheet Entry',
start_time: new Date().format('m/d/Y H:i:s'),
is_billable: 0
}
)
TimeTracker.timeEntryGrid.stopEditing();
var newRow = TimeTracker.dataStore.getCount();
TimeTracker.dataStore.insert(newRow, tce);
TimeTracker.timeEntryGrid.startEditing(newRow, 0);
}
}
],
view: new Ext.grid.GridView(
{
autoFill: true
}
),
colModel: new Ext.grid.ColumnModel(
{
defaults: {
sortable: true,
editable: true
},
columns: [
{
id: 'ticket_number',
header: 'Ticket #',
dataIndex: 'ticket_number',
editor: new Ext.form.TextField({allowBlank: true}),
renderer: function(value) {
return (!value) ? 'N/A' : value;
}
},
{
id: 'description',
header: 'Description',
dataIndex: 'description',
editor: new Ext.form.TextField({allowBlank: false})
},
{
id: 'start_time',
header: 'Start',
dataIndex: 'start_time',
renderer: Ext.util.Format.dateRenderer('m/d/Y h:i A'),
editor: new Ext.form.DateField({allowBlank: false})
},
{
id: 'stop_time',
header: 'Stop',
dataIndex: 'stop_time',
renderer: Ext.util.Format.dateRenderer('m/d/Y h:i A'),
editor: new Ext.form.DateField({allowBlank: false})
},
{
id: 'client',
header: 'Client',
dataIndex: 'client_id',
renderer: function(value) {
return (!value) ? 'N/A' : value;
}
},
{
id: 'billable',
header: 'Billable',
dataIndex: 'is_billable',
renderer: function(value) {
return (!value) ? 'No' : 'Yes';
}
},
{
id: 'actions',
header: null,
xtype: 'actioncolumn',
items: [
{
icon: 'assets/images/silk_icons/page_copy.png',
iconCls: 'action_icon',
handler: function(grid, rowIndex, columnIndex) {
//THE PROBLEM STARTS HERE
grid.stopEditing();
var newRow = TimeTracker.dataStore.getCount();
recordClone = grid.store.getAt(rowIndex);
recordClone.data.start_time = new Date().format('Y-m-d H:i:s');
grid.store.insert(newRow, recordClone);
grid.startEditing(newRow, 0);
}
},
{
icon: 'assets/images/silk_icons/page_delete.png',
handler: function(grid, rowIndex, columnIndex) {
alert('called');
}
}
]
}
]
}
)
}
);
}
);
L'Objectif
Lorsque l'utilisateur clique sur le bouton 'copier', que de stocker l'enregistrement est stocké dans la mémoire, ses start_time " est défini à la date et l'heure, et il est ré-inséré dans le magasin comme un nouveau record
Le Résultat Courant
J'ai le message suivant erreur JS: Uncaught TypeError: Cannot read property 'données' undefined
Ma Question(s)
Pour commencer, je ne suis même pas sûr si je passe la ligne sélectionnée de l'enregistrement de données correctement. Deuxièmement, je n'ai aucune idée de ce que le message d'erreur que je reçois des moyens.
Toute aide est, comme toujours, très appréciée.
Grâce.
Mise à jour de 1
Après quelques réglages, voici ce que j'ai trouvé (ce code modifié pour la copie gestionnaire de bouton)
{
id: 'actions',
header: null,
xtype: 'actioncolumn',
items: [
{
icon: 'assets/images/silk_icons/page_copy.png',
iconCls: 'action_icon',
handler: function(grid, rowIndex, columnIndex) {
grid.stopEditing();
var newRow = TimeTracker.dataStore.getCount();
var currentRecord = grid.store.getAt(rowIndex);
var timecardEntry = grid.store.recordType;
tce = new timecardEntry(currentRecord.data);
tce.data.start_time = new Date().format('Y-m-d H:i:s');
grid.store.insert(newRow, tce);
}
},
{
icon: 'assets/images/silk_icons/page_delete.png',
handler: function(grid, rowIndex, columnIndex) {
alert('called');
}
}
]
}
Voici ce que j'ai fais:
- Arrêter la modification de la grille
- Obtenir le nombre de dossiers actuellement dans le magasin
- Emparer de l'enregistrement actuellement sélectionné et de le stocker dans la mémoire
- Saisir le type d'enregistrement dans le magasin
- Créer une nouvelle instance de la boutique type d'enregistrement, et de les passer dans l'objet de données à partir de l'enregistrement sélectionné. L'objet de données est équivalent à l'objet littéral si vous faisiez un nouveau record à la main (voir mon premier bouton 'ajouter' code pour plus de détails)
- Modifier le start_time nouvelle valeur de l'objet qui a été créé à la date du jour et l'heure
- Insérer un enregistrement dans la grille
- Temps heureux!
Veuillez critique de ce code et laissez-moi savoir si il ya une meilleure façon de le faire. Merci!
Mise à jour 2:
handler: function(grid, rowIndex, columnIndex) {
grid.stopEditing();
var recordClone = grid.store.getAt(rowIndex).copy();
Ext.data.Record.id(recordClone);
if(recordClone) {
grid.store.add(recordClone);
}
}
J'ai mis à jour le code pour utiliser le copier et ajouter des méthodes et fonctionne bien. Cependant, lorsque j'appelle la méthode add() je reçois un 'e n'est pas défini erreur", mais lorsque j'actualise la page, l'enregistrement est inséré malgré le message d'erreur. Des idées?
OriginalL'auteur Levi Hackwith | 2010-11-27
Vous devez vous connecter pour publier un commentaire.
Me semble que ce n'est pas la construction de la
tce
objet correctement. Cette ligne est l'endroit où vous devez configurer votre point d'arrêt:Il semble que c'est avec succès la construction d'un
timecardEntry
qui en quelque sorte n'est pas un dossier. Avoir un poke à tout ce qu'il est la construction peut aider.Si ce n'est pas évident de piquer à elle de cette façon, pourquoi c'est le bec, essayez de le faire comme ça, comme @timdev suggère:
(Vous devriez être en mesure d'appeler
grid.store.add(tce)
au lieu deinsert
que vous êtes en insérant à la fin.)OriginalL'auteur wombleton
Vraiment bien écrite à la question. Bon peu de code, et belle explication de ce que vous êtes coincé sur. Malheureusement, je ne vois rien qui se démarque.
Votre script ressemble surtout à droite. Vous êtes à proximité de là où vous devez être.
Ci-dessous est une réponse que j'ai tapé juste, et puis relisez votre question (et le code), et de la pensée un peu mieux. Vous le savez probablement ce genre de choses déjà, mais c'est ici pour quelqu'un d'autre. Il est également pertinent, parce que je ne vois pas d'erreurs dans la partie pertinente de ce que vous avez fait, alors vous avez probablement raté quelque part d'autre. Les questions sont les suivantes: où et comment?
J'espère que quelqu'un de moins épuisé que je suis va venir et trouver le problème évident, en attendant, voici mon gribouillage sur la façon de déboguer en Ext et pourquoi:
Vous avez laissé quelque chose d'important, ou l'a oublié. Ce message d'erreur que vous avez mentionné:
Uncaught TypeError: Cannot read property 'data' of undefined
-- où est ce qui se passe? On dirait qu'il ne se passe pas dans le code que vous avez posté, il pourrait très bien se produire dans les entrailles de ExtJS.Donc, le feu jusqu'à FireBug, et tourner sur la "rupture " erreur". Faire de votre erreur de se produire, et de commencer à regarder la "pile" volet plus sur la droite (en général). La pile va vous montrer comment vous en êtes arrivé là où vous êtes.
À moins que je me manque quelque chose (et depuis que je suis juste en cours d'exécution de votre code dans ma tête, j'ai très bien peut-être), il y a probablement quelque chose de mal configuré ailleurs à l'origine du bug.
Mais comme avec n'importe quel programme (et surtout avec ExtJS, dans mon expérience), le débogueur est votre ami.
Ce faire:
-debug
version de ext-base.js et ext-all.js (jusqu'à ce que toutes les oeuvres)C'est probablement parce que vous n'êtes pas correctement le clonage de votre dossier. Essayez de changer
recordClone = grid.store.getAt(rowIndex);
:recordClone = grid.store.getAt(rowIndex).copy()
. Éventuellement suivie parExt.data.Record.id(recordClone);
J'allais le dire, en effet, vous n'êtes pas le clonage de l'enregistrement.
et @Drasill, j'ai posté quelques mise à jour du code. Prendre un coup d'oeil. Merci!
Hackith - Vous êtes probablement toujours le même problème qu'avant. Que faire si vous essayez de définir le record avec
Ext.data.Record.id(tce)
avant d'essayer de l'insérer() dans le magasin? Je ne suis pas exactement sûr de l'intérieur les détails de l'Enregistrement() constructeur, et je ne suis pas sûr de savoir pourquoi vous ne vous contentez pas de copier() de l'enregistrement, comme je l'ai suggéré hier-ce que c'est exactement le cas d'utilisation de cette copie() a été conçue pour.OriginalL'auteur timdev