[jQuery]JSON key variabel maken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 08-09 11:16
Ik ben bezig met CakePHP en jQuery. Daarbij wil ik wat data met een post request versturen. Klinkt eenvoudig en is het normaal ook.

In regel 5 wil ik de tekst "admin" variabel maken. Ik wil daar dus admin, manager, whatever in kunnen vullen vanuit een variabele.

Wat lukt er niet: Omdat het een JSON deel is in jQuery mag ik op de een of andere manier geen strings aan elkaar plakken:

Werkend voorbeeld (hardcoded):
JavaScript:
1
'data[ProfileUser][admin]' : ($(this).is(':checked') ? '0' : '1'),


Niet werkend voorbeeld: Syntax error: Unexpected token +
JavaScript:
1
2
var mytype='admin';
'data[ProfileUser][' + mytype + ']' : ($(this).is(':checked') ? '0' : '1'),



Relevante stuk code:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
$('.classname').change(function(e) {
        $.post(
            baseUrl + 'controller/edit/' + $(this).attr('myid'), 
            {
                'data[ProfileUser][admin]' : ($(this).is(':checked') ? '0' : '1'),
                'data[ProfileUser][id]' : $(this).attr('myid'),
                
            },
            function(data) {
                //$(this).attr('src', );
            }
        );
    });


Heeft iemand enig idee hoe ik die strings wel aan elkaar krijg of op alternatieve wijze een flexibele JSON key kan maken?

[ Voor 5% gewijzigd door djluc op 02-12-2011 22:56 ]


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
stop het in een lokale variabele en doe dan zo:
JavaScript:
1
2
3
4
var myvar = { 
        'data[ProfileUser][id]' : $(this).attr('myid')
};
myvar['data[ProfileUser][' + mytype + ']'] = ($(this).is(':checked') ? '0' : '1');

[ Voor 31% gewijzigd door Juup op 02-12-2011 23:05 ]

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 08-09 11:16
Juup schreef op vrijdag 02 december 2011 @ 23:03:
stop het in een lokale variabele en doe dan zo:
JavaScript:
1
2
3
4
var myvar = { 
        'data[ProfileUser][id]' : $(this).attr('myid')
};
myvar['data[ProfileUser][' + mytype + ']'] = ($(this).is(':checked') ? '0' : '1');
Beste Jaaap, erg bedankt! Dit is inderdaad de clue. Heb je ook enig idee waarom dit ineens anders werkt zodat het in die post commando staat?

Acties:
  • 0 Henk 'm!

Verwijderd

djluc schreef op vrijdag 02 december 2011 @ 23:24:
[...]

Beste Jaaap, erg bedankt! Dit is inderdaad de clue. Heb je ook enig idee waarom dit ineens anders werkt zodat het in die post commando staat?
Dit geeft gewoon een syntax error, die plus mag daar helemaal niet:
JavaScript:
1
2
3
var a = {
  'hel' + 'lo' : 'world'
};

De propertyName in een Object mag een string, een number of een identifier zijn, maar geen expressie. De propertyValue mag wel een expressie zijn.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 08-09 11:16
Toch werkt deze wel zonder foutmelding waarbij het eerste voorbeeld niet werkt. Het lijkt dat er een verschil zit tussen het json deel in jquery en er buiten. Mocht er een nettere oplossing zijn is dat uiteraard ook top.

Acties:
  • 0 Henk 'm!

Verwijderd

djluc schreef op vrijdag 02 december 2011 @ 23:58:
Toch werkt deze wel zonder foutmelding waarbij het eerste voorbeeld niet werkt. Het lijkt dat er een verschil zit tussen het json deel in jquery en er buiten. Mocht er een nettere oplossing zijn is dat uiteraard ook top.
Ik snap niet wat je bedoelt. Er zit geen verschil in JSON binnen of buiten jQuery.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

Maar "data[ProfileUser][admin]" is gewoon hetzelfde als data.ProfileUser.admin? Oftewel in JSON:

JavaScript:
1
2
3
4
5
6
7
{
   'data': {
      'ProfileUser': {
         'admin': 'blaat'
      }
   }
}


Snap niet zo goed waarom je met die string zit te kutten in JSON. JSON is een Object Notatie (rara waar die O en N voor staan :+)

edit: Overigens is dat argument bij $.post helemaal niet per definitie JSON. Het is gewoon een key/value set in een objectnotatie.

Wat je eventueel kunt doen is (even snel):

JavaScript:
1
2
3
var blaat = {};
blaat['mijn['+'rare'+'][string]'] = 'value';
$.post('url',blaat,callback);


Of direct met een anonieme functieaanroep binnen de post, maar daar wordt het voor jou niet overzichtelijker van denk ik.

[ Voor 74% gewijzigd door Bosmonster op 03-12-2011 03:00 ]


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Veel beter alternatief is om te stoppen met het in allerlei bochten wringen van form post variabelen en gewoon echt JSON te sturen naar je PHP applicatie. Verder zou ik een HTML5 data-* attribuut gebruiken i.c.m. jQuery.data, i.p.v. het verzonnen myid attribuut uit te lezen, zoals je nu doet. Voelt gewoon wat netter aan.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var user = { id: $( this ).data("userid" ) };

// Variable variable here
user[ "admin" ] = $( this ).prop( "checked" );

$
  .ajax({
    url: baseUrl + "controller/edit/" + user.id,
    data: JSON.stringify({ profileUser : user }),
    contentType: "application/json",
    dataType: "json"
  })
  .done( function( response ) {
    /* ... */
  });

[ Voor 3% gewijzigd door R4gnax op 03-12-2011 14:23 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

Voelt gewoon wat netter aan.
Voelt niet alleen zo, is gewoon zo. Custom attributen mogen helemaal niet en valideren ook niet. Daar heeft html5 juist de data-prefix voor geintroduceerd.

[ Voor 17% gewijzigd door Bosmonster op 03-12-2011 14:32 ]

Pagina: 1