2011-07-08 40 views
12

Tôi có đoạn mã sau:JQuery loại bỏ mảng trống khi gửi

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

Kịch bản recieving (block_ajax.php) chỉ recieves "hành động" và "listid" tham số. Khi tôi kiểm tra những gì được gửi bằng Chrome, tôi thấy thông số "bố cục" thậm chí không được gửi tới tập lệnh phụ trợ.

Vì có sự khác biệt giữa một mảng trống và sự vắng mặt của một mảng, tôi muốn có JQuery gửi mảng trống. Tôi có thể tìm thấy một số chỉ dẫn rằng JQuery (1.6.1) dường như làm điều này, nhưng không phải làm thế nào để ngăn chặn nó làm như vậy. Định dạng JSON cho phép các mảng trống và các đối tượng trống, vì vậy tôi nghĩ rằng nó sẽ là có thể.

Có ai biết điều gì cần thay đổi để JQuery có thể gửi các mảng trống không?

+0

Tại sao gửi tham số trống? Nếu bạn muốn đặt cờ hoặc mã thông báo hoặc thứ gì đó, chỉ cần thực hiện 'layout: true'. – Bojangles

+0

thử '" [] "'. Nên làm thủ thuật – eagor

Trả lời

-4

Tôi không chắc chắn lý do bạn cần gửi thông số trống. Chỉ cần kiểm tra sự tồn tại của tham số trong kịch bản lệnh PHP là đủ. Tuy nhiên, nếu bạn thực sự muốn làm điều đó, hãy sử dụng 'layout': [""] thay vì 'layout': []. Tham số phải được gửi.

(Ngoài ra, bạn có thể muốn đổi tên layout để layout[] để chỉ ra đó là một mảng, nhưng điều này là không cần thiết.)

+0

Mã duy trì cấu trúc cây của các vùng chứa với các trường trong chúng. Tập lệnh clientside cần giao tiếp với phần phụ trợ cho dù các thùng chứa đã được làm trống (mảng trống) hay bị loại bỏ hoàn toàn khỏi cây (không có mục nhập). –

+0

Hãy xem xét rằng tôi có danh sách 'mục' mà người dùng xóa trong mô hình phức tạp. Thông thường tôi chỉ cập nhật các trường đã thay đổi. Nếu tôi không nhận được tham số nào cả, trường sẽ không được cập nhật và danh sách mục sẽ không được cập nhật - nhưng tất cả các mục sẽ bị xóa khi tôi đặt 'items = array()' phải không? Hoặc thậm chí 'items = null', nhưng không có bất kỳ mô hình thông tin (post/get) nào không biết nếu nó thậm chí còn chạm vào trường' items'! –

+0

PeterM bạn có tìm được giải pháp cho điều này không? Tôi đang trải nghiệm chính xác những gì bạn đã nói. Nếu mảng trống được gửi, tôi muốn xóa tất cả các mục, nếu một mảng có các mục tôi muốn thêm các mục không có sẵn và loại bỏ những mục không còn ở đó nữa. Cuối cùng, không có gì hoặc null nên bỏ qua kiểm tra. – Autonomy

-1

Hãy thử điều này:

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

để có được một mảng trống rỗng mới nếu mảng được truyền là rỗng, mảng "thực" với dữ liệu khác.

+2

Điều này sẽ làm việc cho các trường hợp đơn giản, tuy nhiên nó vẫn gây phiền nhiễu –

+2

Tôi biết thi là một câu trả lời rất, rất cũ, nhưng tôi cần phải downvote điều này vì nó không trả lời câu hỏi cả. Bạn chỉ đơn thuần là 'sửa chữa' các kết quả của lỗi, không phải lỗi của chính nó. Người dùng không muốn một mảng trống nếu anh ta không có bất kỳ, người dùng muốn gửi các mảng trống. Có một sự khác biệt rất lớn giữa A: Một danh sách trống rỗng, B: Không có gì. – thisisboris

0

tôi nghĩ rằng json sẽ giúp đỡ trong trường hợp này

mã hóa các mảng trong js và gửi kết quả sau đó giải mã nó trong php

nhưng điều này sẽ mất một nguồn

7

tổ chức chúng tôi có hai cách tiếp cận cho vấn đề:

  • Gửi dữ liệu dưới dạng JSON ngược với dữ liệu POST là một cách tiếp cận tất cả các mục đích tốt, mặc dù đôi khi rất khó để tích hợp với khung hoạt động như Rails, vì bạn có thể phải thêm các cuộc gọi back-end rõ ràng để giải mã dữ liệu JSON.
  • [""] như được ghi chú bởi vinod sẽ hoạt động tốt, vì nhiều khung công tác (ví dụ: Đường ray) sẽ thường coi đây là một mảng trống. (vì lý do, xem this Stack Overflow answer).
    • Lưu ý: Tính năng này hoạt động khi cố gắng tích hợp với một số khía cạnh của Rails, cụ thể khi gửi danh sách các id của đối tượng có liên quan theo mối quan hệ has_many. Ví dụ. nếu bạn có một bảng foos và một bảng barsfooshas_many :bars through :foo_bars, một cách để xóa tất cả các liên kết trên một đối tượng foo là để vượt qua foo: { bar_ids: [""] }.

Cả hai cách tiếp cận là tin tặc hơn mong muốn và tôi rất vui khi khám phá cách tiếp cận rõ ràng hơn.

+1

Câu trả lời hay, nhưng thực tế các đường ray không xử lý '['']' làm mảng trống: '[''] .empty? # => false' '[''] .blank? # => false' –

+0

@AlterLagos Đúng, trong trường hợp chung, nhưng khi nhận được dưới dạng dữ liệu POST, Rails dường như coi '[' '] 'là một mảng trống. (Ví dụ trong ví dụ từ ghi chú của tôi, Rails không tạo ra một mối quan hệ ánh xạ 'foo' tới' bar_id: "" '- nó chỉ xóa tất cả các quan hệ foo/bar) –

+1

Oh nvm, tôi vừa mới nhận ra về ghi chú của bạn và, trên thực tế, điều đó sẽ chỉ áp dụng cho danh sách các id. Trong trường hợp của tôi nó là một trường json và do đó nó đã được lưu vào db như một mảng với một chuỗi rỗng. –

Các vấn đề liên quan