I've got an ExtJS interface that addresses a problem I'm sure tons of people have had before. I have a service that exposes a list of items, and I need to show that list in a GridPanel. I have this part working. When I click one of the items, I handle the selectionchange
event in the GridPanel's SelectionModel, and use it to load details of the resource from another REST call.
Now, I want to be able to add a new item. This seems like it should be simple, but I want to add the item to the GridPanel and at the same time clear the "detail" fields so the user can enter new details and save a complete item. I have an Add button, which creates a Prompt to input an item name.
Now, I add this item to the GridPanel's backing data store (a JsonStore
if that matters) and use getSelectionModel().selectLastRow()
to highlight it. Of course, this fires off the selectionchange
event, which wants to load the details of the (non-existent) item. I've tried using .purgeListeners()
, making the `selectLastRow() call, then restoring the selectionchange listener, but for some reason the changed event still fires off -- I don't actually have any symptoms in the UI, but I can see in Firebug that it's making a (failed) GET call for the item details.
I'd like to stop this from happening, and I feel like this should be a common / easy problem, but I haven't been able to find a solution. What's the right way to add a new item to the GridPanel without having your code try to "look up" the item before you save it?
ETA: A commenter pointed out that there's a phantom
property on Record objects, which sounds like exactly what a want. However, when I load my item list as
STORE = new Ext.data.JsonStore({
autoLoad: true,
url: 'items'
method: 'GET',
storeId: 'store',
root: 'list',
remoteSort: false,
fields: ['name']
});
all the records in the list, as soon as I load them, are marked phantom
. Does phantom
not work with JsonStore? Should I go about this another way?
ETA Again: OK, found it. I wasn't setting the idProperty
property on my JsonStore constructor, which meant that the Records didn't have an id, which meant that they were always phantom
. Now my new record shows phantom
while ones that are already in the DB do not. Woo-hoo!