2011-07-08 23 views
12

Tengo el siguiente código:jQuery elimina matrices vacías al enviar

$.post('block_ajax.php' 
    , { 'action': 'set_layout' 
     , 'listid': 123 
     , 'layout': [] 
     } 
    , function(data) { 
      // ... 
     } 
); 

El guión recieving (block_ajax.php) solamente recieves la "acción" y los parámetros "listid". Cuando inspecciono lo que se envía con Chrome, veo que el parámetro "diseño" ni siquiera se envía al script de back-end.

Dado que existe una diferencia entre una matriz vacía y la ausencia de una matriz, me gustaría que JQuery envíe la matriz vacía. Puedo encontrar algunas indicaciones de que JQuery (1.6.1) parece hacer esto, pero no cómo evitar que lo haga. El formato JSON permite matrices vacías y objetos vacíos, por lo que creo que debería ser posible.

¿Alguien sabe qué cambiar para que JQuery pueda enviar matrices vacías?

+0

¿Por qué enviar un parámetro vacío? Si desea establecer un indicador o token o algo así, simplemente haga 'layout: true'. – Bojangles

+0

try '" [] "'. Debe hacer el truco – eagor

Respuesta

-4

No estoy seguro de por qué necesita enviar un parámetro en blanco. Simplemente verificar la existencia del parámetro en el script PHP debería ser suficiente. Sin embargo, si realmente desea hacerlo, use 'layout': [""] en lugar de 'layout': []. El parámetro debe ser enviado.

(Además, es posible que desee cambiar el nombre de layout a layout[] para indicar que es una matriz, pero esto no es necesario.)

+0

El código mantiene una estructura en árbol de contenedores con campos en ellos. La secuencia de comandos del cliente necesita comunicarse con el servidor si los contenedores se han vaciado (matriz en blanco) o si se han eliminado por completo del árbol (sin entrada). –

+0

Considere que tengo una lista de 'elementos' que el usuario elimina en un modelo complejo. Normalmente solo actualizo los campos modificados. Si no obtengo ningún parámetro, el campo no se actualizará y la lista de elementos no se actualizará, pero todos los elementos se eliminarán cuando configure 'items = array()' right? O incluso 'items = null', pero sin ningún modelo de información (post/get) no sabe si debería tocar el campo' items'. –

+0

PeterM ¿Encontraste una solución a esto? Estoy experimentando exactamente lo que dijiste. Si se envía una matriz vacía, quiero eliminar todos los elementos, si una matriz tiene elementos, quiero agregar los que ya no están allí y eliminar los que ya no deberían estar ahí. Finalmente, nada o nulo debe omitir el cheque. – Autonomy

-1

Prueba esto:

(isset($_POST['layout'])) ? $_POST['layout'] : array(); 

para obtener una nueva matriz vacía si el la matriz pasada está vacía, la matriz "real" con datos de lo contrario.

+2

Esto funcionará para casos simples, sin embargo, sigue siendo molesto –

+2

Sé que esta es una muy, muy vieja respuesta, pero tengo que rechazar esto ya que no responde la pregunta en absoluto. Simplemente estás "arreglando" los resultados del error, no el error en sí. El usuario no quiere una matriz vacía si no tiene ninguna, el usuario desea enviar matrices vacías. Hay una gran diferencia entre A: una lista que está vacía, B: nada. – thisisboris

0

Creo JSON ayudará en tal caso

codifican la matriz en js y enviar el resultado a continuación decodificarlo en php

pero esto llevará algún recurso

7

Nuestra organización tiene dos enfoques al problema:

  • Enviar datos como JSON en lugar de datos POST es un buen enfoque para todo uso, aunque esto a veces es un poco difícil de integrar con el marco funciona como Rails, porque puede que tenga que agregar llamadas explícitas de fondo para decodificar los datos JSON.
  • [""] según lo observado por vinod funcionará bien, ya que muchos marcos (por ejemplo, los rieles) a menudo tratarán esto como una matriz vacía. (por la razón, vea this Stack Overflow answer).
    • Nota: Esto funciona cuando se trata de integrar con algunos aspectos de Rails, específicamente cuando se envía una lista de identificadores de objetos que están relacionados por una relación has_many. P.ej. si tiene una tabla foos y una tabla bars, y fooshas_many :bars through :foo_bars, una forma de eliminar todas las asociaciones en un objeto foo es pasar foo: { bar_ids: [""] }.

Ambos enfoques son hackier de lo deseado, y yo estaría encantado de descubrir un método más limpio.

+1

Buena respuesta, pero en realidad los rieles no tratan '['']' como una matriz vacía: '[''] .empty? # => false' '[''] .blank? # => false' –

+0

@AlterLagos Correcto, en el caso general, pero cuando se recibe como POST-data, Rails parece tratar '['']' como una matriz vacía. (Por ejemplo, en el ejemplo de mi nota, Rails no crea una relación mapeando el 'foo' especificado a' bar_id: "" '- simplemente borra todas las relaciones foo/bar) –

+1

Oh nvm, me acabo de dar cuenta de tu nota y, de hecho, eso debería aplicarse solo para listas de identificadores. En mi caso, era un campo json y por eso se guardó en el db como una matriz con una cadena vacía. –

Cuestiones relacionadas