2010-09-02 15 views
8

Jestem w trakcie przenoszenia ciężkiej aplikacji WWW JSF do aplikacji REST i głównie do modułu JS.Niezależne zdarzenia dotyczące piaskownicy JavaScript i stosu po stronie klienta

Widziałem „skalowalną architekturę aplikacji javascript” Nicholas Zakas na YUI teatru (doskonałe wideo) i wdrażane dużo rozmowie z dobrym wynikiem, ale mam kilka pytań:

  1. znalazłem Wykład nieco mylący w odniesieniu do związku między modułami a piaskownicami, z jednej strony, moim zdaniem, moduły nie powinny być zakłócane przez coś, co dzieje się poza ich piaskownicą i dlatego publikują wydarzenia za pośrednictwem piaskownicy (a nie poprzez rdzeń, ponieważ rdzeń służy do ukrywania podstawowej biblioteki), ale każdy moduł w aplikacji otrzymuje nowy obszar izolowany? Czy sandbox nie powinien ograniczać zdarzeń do modułów używających go, czy też zdarzenia powinny być publikowane na stronie? na przykład : jeśli mam dwie edytowalne tabele, ale chcę je przechowywać w innym obszarze izolowanym, a jego zdarzenia mają wpływ tylko na moduły w tym obszarze izolowanym, na przykład w polu komunikatu na tabelę, która jest innym modułem/widgetem, w jaki sposób mogę to zrobić za pomocą piaskownicy za każdy moduł, oczywiście mogę przedłużyć zdarzenia z modułu id, ale to tworzy sprzężenie, którego chcę uniknąć ... i nie chcę spakować modułów razem jako jeden moduł na kombinację, ponieważ mam już 6-7 modułów.

  2. Podczas gdy mogę ukryć bibliotekę podstawową dla małych rzeczy, takich jak selektor id itp. Chciałbym nadal korzystać z biblioteki bazowej dla zależności modułów i ładowania zasobów i użyć czegoś takiego jak moduł ładujący YUI lub dojo.require, więc w rzeczywistości ukrywanie biblioteki bazowej, ale same moduły są definiowane i ładowane przez bibliotekę podstawową ... wydaje mi się trochę dziwne.

  3. Biblioteki nie zwracają prostych obiektów js, ale zazwyczaj zawijają je np. : Możesz zrobić coś takiego jak $$ (".nazwęklasy") .Każdy (... który czyści kod dużo, nie ma sensu owijać bazy, a następnie w module tworzyć zależność dla biblioteki bazowej przez wykonanie .each ale nie używanie tych funkcji powoduje, że napisany jest dużo kodu, który można pominąć ... a implementacja tej funkcji jest bardzo podatna na błędy.Auton:

  4. Czy ktokolwiek ma doświadczenie w budowaniu stosu z przodu tego zamówienia? czy to jest zmiana biblioteki bazowej i/lub posiadanie modułów z różnych bibliotek, używanie datowalnych danych Yui, ale weryfikacja formularza za pomocą dojo ...?

  5. Nieco kombinacji 2 + 4, jeśli zdecydujesz się zrobić coś takiego jak ja powiedział i wczytał dojo z widżetów walidacyjnych dla wejść przez program ładujący YUI t oznacza, że ​​dojocore jest modułem, a moduł formy jest od niego zależny?

Dzięki.

+0

Jestem bardzo zainteresowany w sposób, w jaki sposób łączyć JSF (zwłaszcza jego złącza backend jak a4j: jsFunction) utrzymanie modułów JavaScript zamknięty ?! –

+0

Cześć Nikita, nie podłączyłem JSF i go zastąpiłem, zasadniczo wziąłem moje usługi back-end, które zostały zamknięte w JSF Beans i odsłoniłem je poprzez mapowanie ReST i napisałem interfejs w czystym JS. – Amnon

Odpowiedz

3

Stosujemy ten wzór w naszych aplikacjach. Zapoznaj się z książką JavaScript Patterns autorstwa Stoyana Stefanova, aby uzyskać szczegółowy opis implementacji wzoru Sandbox. Zasadniczo wygląda to mniej więcej tak:

(function (global) { 
    var Sandbox = function fn (modules, callback) { 
     var installedModules = Sandbox.modules, 
      i = 0, 
      len = modules.length; 

     if (!(this instanceof fn)) { 
      return new fn(modules, callback); 
     } 

     // modules is an array in this instance: 
     for (; i < len; i++) { 
      installedModules[modules[i]](this); 
     } 

     callback(this); 
    }; 

    Sandbox.modules = {}; 
    global.Sandbox = Sandbox; 

})(this); 

// Example module: 
// You extend the current sandbox instance with new functions 
Sandbox.modules.ajax = function(sandbox) { 
    sandbox.ajax = $.ajax; 

    sandbox.json = $.getJSON; 
}; 

// Example of running your code in the sandbox on some page: 
Sandbox(['ajax'], function(sandbox) { 

    sandbox.ajax({ 
     type: 'post', 
     url: '/Sample/Url', 
     success: function(response) { 
      // success code here. remember this ajax maps back to $.ajax 
     } 
    }); 

}); 
+0

installedModules nie jest nigdzie zadeklarowane ... czy to globalne czy literówka? – mrk

+0

Typo. Poprawione, sprawdź, czy to działa. – Eli

Powiązane problemy