Do the JSON objects for joined table contents have not be named the same as a column?
Do the JSON objects for joined table contents have not be named the same as a column?
I have a 1:N relationship (EQUIPMENT) working in my joined table, but adding a 1:1 (SPECIES_ID), which should be simpler, gives me a blank select box every time. I've spent hours checking and re-checking the generated JSON and the DT/Editor Javascript and I swear they are perfect.
I would try using a different column name, but I am hoping this isn't required because in my implementation it's pretty important they are the same: The column provides the table ID. It's also how the implementation determines if a join is 1:1 or 1:N.
Applicable code (trimmed):
Editor:
[code]
"fields": [
//...
{"label": "Equipment:", "name": "EQUIPMENT[].id", "type": "checkbox" }, // works
{"label": "Species:", "name": "SPECIES_ID.id", "type": "select" } // !works
[/code]
DataTables:
[code]
{"mData":"PARENT_RECIPE"},
{
"mData": "SPECIES_ID.name",
"sDefaultContent": "foo"
},
{"mData":"EQUIPMENT", "mRender":"[, ].name"},
/// ...
[/code]
Some of the JSON "SPECIES_ID" object, appended to the JSON after "aaData"
[code]
"SPECIES_ID": [{
"value": "1",
"0": "1",
"label": "UNKNOWN (UNKNOWN)",
"1": "UNKNOWN (UNKNOWN)"
},
{
"value": "2",
"0": "2",
"label": "B (Boron)",
"1": "B (Boron)"
},...
[/code]
An entry from aaData containing the species and equipment for one row:
[code]
"SPECIES_ID": {
"id": "3",
"name": "P (Phosphorus)"
},
"EQUIPMENT": [{
"id": "6",
"name": "CIVAR11X"
},
{
"id": "8",
"name": "CIVAR62X"
}],
[/code]
The only thing I can think of is that DTE may not like SPECIES_ID being both a column name and a JSON object. I can't figure out why it would matter though as they are accessed and treated very differently as far as I can tell.
If not, does anyone have a theory as to why my select box is always empty?
I would try using a different column name, but I am hoping this isn't required because in my implementation it's pretty important they are the same: The column provides the table ID. It's also how the implementation determines if a join is 1:1 or 1:N.
Applicable code (trimmed):
Editor:
[code]
"fields": [
//...
{"label": "Equipment:", "name": "EQUIPMENT[].id", "type": "checkbox" }, // works
{"label": "Species:", "name": "SPECIES_ID.id", "type": "select" } // !works
[/code]
DataTables:
[code]
{"mData":"PARENT_RECIPE"},
{
"mData": "SPECIES_ID.name",
"sDefaultContent": "foo"
},
{"mData":"EQUIPMENT", "mRender":"[, ].name"},
/// ...
[/code]
Some of the JSON "SPECIES_ID" object, appended to the JSON after "aaData"
[code]
"SPECIES_ID": [{
"value": "1",
"0": "1",
"label": "UNKNOWN (UNKNOWN)",
"1": "UNKNOWN (UNKNOWN)"
},
{
"value": "2",
"0": "2",
"label": "B (Boron)",
"1": "B (Boron)"
},...
[/code]
An entry from aaData containing the species and equipment for one row:
[code]
"SPECIES_ID": {
"id": "3",
"name": "P (Phosphorus)"
},
"EQUIPMENT": [{
"id": "6",
"name": "CIVAR11X"
},
{
"id": "8",
"name": "CIVAR62X"
}],
[/code]
The only thing I can think of is that DTE may not like SPECIES_ID being both a column name and a JSON object. I can't figure out why it would matter though as they are accessed and treated very differently as far as I can tell.
If not, does anyone have a theory as to why my select box is always empty?
This discussion has been closed.
Replies
For example, change, in your DataTables initialisation, change `SPECIES_ID.name` to `SPECIES_ID.id` (i.e. a property that does exist within the data source object) and you should see the id inserted. You are getting an empty box because `SPECIES_ID.name` does not exist in the data source object!
So the way to address this is to use mRender to look up the external data. Something like:
[code]
mData: 'SPECIES_ID.name',
mRender: function ( data, type, row ) {
return json.SPECIES_ID[ data ];
}
[/code]
Two assumptions here:
1. `json` can be accessed from your mRender (you'll need to make it available - how that is done will depend upon your setup - assigning it to a 'locally global' variable in fnServerData for example would work.
2. The `id` (i.e. `data` in the mRender function) is also the array index. If that isn't the case, you'd need to do a lookup, spinning through the SPECIES_ID array looking for the right id (which, if you have a lot of records could slow things down).
Allan
Both the SPECIES_ID and EQUIPMENT objects have the same scope
I'm sorry but I still do not understand why species_id needs to be accessed differently than equipment. I think some pictures will help me describe the issue better than words.
The data provided for the Editor seems to be the problem, but it seems to be in exactly the same format as the example. Also, EQUIPMENT and SPECIES_ID have the same scope, so why would one be available but not the other?:
http://i.imgur.com/tY1pr.png
Entries in aaData for each row (this works fine -- the DataTable shows EQUIPMENT.name for both 1:1 and 1:N):
http://i.imgur.com/pi3kG.png
Visually, here's the DataTable and part of the edit form when I click "edit" for the top row:
http://i.imgur.com/CUOez.png
Allan
That's it. I was missing: [code]editor.field('SPECIES_ID.id').update( json.EQUIPMENT );[/code]
How unsettling it is to have missed something so obvious. Thank you again, Allan! I hope this comes up in a Google search for someone else who needs to pay more attention to their code so that your time answering it won't be wasted.
Allan