2009-06-22 12 views
5

Zajmuję się tworzeniem aplikacji, która opiera się głównie na jQuery dla interakcji użytkownika.
(a jeśli przeglądarka nie obsługuje jQuery, a następnie uaktualnij lub nie korzystaj z mojej aplikacji):Część 1: jQuery -> MySQL -> jQuery -> HTML

Zwykle funkcjonuje funkcja GET, SET i DELETE danych z tabeli.

W mojej aplikacji zgrywam się i konfiguruję wiele informacji bez przeładowywania strony. Aby to zrobić, używam głównie jQuery.post.

Typowy kod w moim pliku JS wygląda następująco:

jQuery.post("mypath/jquery_getset_data.php", { instance: 'getItems_A', itemID: itemID_value}, 
    function(data) { 
    populateItemList(data); 
    }); 

jquery_getset_data.php zawiera wielu jeżeli oświadczenia:

if($_POST['instance'] == 'getItems_A'){ 
    // PHP code to get and process data from MySQL DB 
} 

if($_POST['instance'] == 'setItems_A'){ 
    // PHP code to process and insert data to MySQL DB 
} 

Oto moje pytanie:

  1. Czy jest lepszy sposób interakcji między plikiem JS a jquery_getset_data.php?

  2. Jak mogę dynamicznie wywoływać różne funkcje "usuń element" wewnątrz createStoreList? Zobacz Aktualizacja 1.

Aktualizacja 1: Jest to kod, który używam do tworzenia wielu różnych list.

function createStoreList(data) 
    { 
    var ul = jQuery("<ul/>"); 

    // We need to build the html structure in order for this to be registered in DOM. 
    // If we don't, jQuery events like .click, .change etc. will not work.  
    for (var i = 0; i < data.length; i++) 
    { 
     ul.append(
     jQuery("<li/>") 
     .attr("id", "listItem_"+data[i].id) 
     .append(jQuery("<span/>") 
      .addClass("btnRemoveItem") 
      .attr("title", "Remove store from list") 
      .attr("id", data[i].id) 
      .click(function() { removeItemA(this); }) 
     ) 
     .append(data[i].name + ', ' + data[i].street) 
     );    
    } 
    return ul; 
    } 

Aktualizacja 2 Pomyślałem po prostu przydałoby oświadczenia przełącznika. Przetestowałem to i działa.

.click(function() { 
     switch(instance) 
     { 
      case 'removeListItemA': removeListItemA(this); break; 
      case 'removeListItemA': removeListItemB(this); break; 
      case 'removeListItemA': removeListItemC(this); break; 
     } 
    }) 
+0

może powinieneś opublikować przykłady "prawie identycznego kodu"? BTW, naruszyłeś kod managera, nie zagnieżdżając parens blisko twojej buźki: powinien przeczytać "albo nie używaj mojej aplikacji :))": D: D – jrharshath

+2

+1 dla "jeśli przeglądarka nie obsługuje jQuery, to zaktualizuj lub nie używaj mojej aplikacji ". :-) – KyleFarris

Odpowiedz

1

Jedyną rzeczą, którą chciałbym zmienić to w jquery_getset_data.php chciałbym użyć instrukcji switch zamiast wielu if. Metoda $ .post jQuery jest dobra dla tego, co robisz, rozmowa ze skryptem wpływającym na bazę danych (usuwanie/aktualizacje/etc) przy użyciu jednej z metod ajax GET ($ .load lub $ .get) łamie specyfikację HTTP.

+0

Tak, myślałem o tym. Zamień moje fragmenty kodu w funkcje i wywołaj je z instrukcji SWTICH. – Steven

+0

"używanie jednej z metod ajax GET ($ .load lub $ .get) łamie specyfikację HTTP." Jak masz na myśli? – Ash

+0

@Ashley Ward - Żądania GET nie powinny powodować trwałych zmian w aplikacji (aktualizacje bazy danych, wstawienia, usunięcia). Po to jest POST. – karim79

3

Aby zmniejszyć jquery_getset_data.php, użyłbym wzorców projektowych OOP, aby uniknąć przełączeń i instrukcji if.

class ICommand 
{ 
    public: 
      function execute(); 
}; 

class CommandGetItemA 
{ 
    public: 
      function execute() 
      { 
       //do some staff here 
      }; 
}; 

, a następnie:

CommandsMap['getItemA'] = new CommandGetItemA(); 
CommandsMap['setItemA'] = new CommandGetItemB(); 
.... 

CommandsMap[ $_POST['instance']].execute(); 

wiem wygląda skomplikowanie, ale na mój gust wygląda o wiele lepiej. Co do twojego drugiego pytania, nie jestem pewien, czy to zrozumiałem, czy możesz dodać więcej wyjaśnień?

Po widziałem zaktualizować, myślę, że na drugie pytanie można zrobić:

.click(function() { 
     window[instance](this); 
}); 

Tam „instancja” to nazwa funkcji, lub można zaktualizować lub dołączyć to ostatni, aby być funkcja Nazwa;

+0

Każda instrukcja "if" wykonuje inny kod, aby osiągnąć cel. W jaki sposób ten wzór OOP może zmniejszyć ilość kodu? Nie jestem pewien, czym jest CommandsMap []. Aktualizacja Q2. – Steven

+0

Nie twierdzę, że zmniejszy to ilość kodu, ale na pewno sprawi, że będzie on bardziej czytelny i przejrzysty. Za każdym razem, gdy będziesz potrzebować dodać nową instrukcję if, będziesz musiał napisać klasę z logiką, którą chcesz dodać i "zarejestrować" tę klasę w CommandsMap. –