2013-08-26 13 views
6

Chcę podzielić się niektórymi danymi między różnymi modułami, tworząc jeden moduł, wywoływany na przykład dataService, wstawić do niego zmienną, a następnie wstawić ten moduł do innych modułów jako zależność . Oto kod (który nie działa):Jak udostępniać dane między różnymi modułami w requirejs, javascript

define('dataService', function() { 
    var quotes = []; 
    return { 
    quotesArray: quotes, 
     }; 
}); 

require(['dataService'], function (dataService) { 
    dataService.quotesArray {1, 2, 3}; // setting the quotes variable 
}); 

define('otherModule', ['dataService'], function (dataService) { 
    var x = dataService.quotesArray; // x = empty Array, why? 
}); 

tutaj jest obejście:

define('dataService', function() { 
    var quotes = []; 
    var getQuotes = function() {  
     return quotes; 
    }; 
    var setQuotes = function (newQuotes) { 
     quotes = newQuotes; 
    }; 
    return { 
     getQuotes: getQuotes, 
    }; 
}); 

require(['dataService'], function (dataService) { 
    var x = dataService.getQuotes(); // now I can get/set the quotes variable 
    dataService.setQuotes(); 
}); 

Zastanawiam się tylko, czy jest to właściwy sposób, aby niektóre dane były dostępne w różnych moduły?

A dlaczego pierwsza opcja nie działa?

+0

możliwe duplikat [Using RequireJS, w jaki sposób mogę przekazywać obiekty globalne lub singletony?] (http://stackoverflow.com/questions/5608685/using-requirejs-how-do-i-pass-in-global-objects-or-singletons-around) – explunit

+0

Pierwszy utwór działa zgodnie z oczekiwaniami, jak pokazuje to skrzypce, http://jsbin.com/ifeyefo/1/. Coś jest nie tak z twoją konfiguracją. Czy to naprawdę kod, którego używasz, lub uproszczony przykład. –

+0

@Andreas Köberle, przepraszam, nie mogę otworzyć skrzypiec. Jest to w przybliżeniu kod, którego używam. –

Odpowiedz

6

Do tej pracy potrzeba, aby utworzyć wystąpienie obu, więc jeden nadpisuje właściwości drugiego:

define('Quotes', function (Module) { 
    return { 
     quotesArray: ['a', 'b', 'c'] 
    }; 
}); 

define('Service', ['Quotes'], function (quotes) { 
    console.log(1, quotes.quotesArray); // ["a", "b", "c"] 
    quotes.quotesArray = [1, 2, 3]; 
}); 

require(['Service', 'Quotes'], function(service, quotes) { 
    console.log(2, quotes.quotesArray); // [1, 2, 3] 
}); 

Oto skrzypce robocze: http://jsfiddle.net/kmturley/aHgMJ/

+0

Czy zależności ładują asynchronicznie bez żadnego zlecenia, ale są wykonywane w kolejności - usługi - wyceny? – kitimenpolku

+0

Porządek byłby następujący: zdefiniowano moduł wyceny, zdefiniowano moduł serwisowy, moduł serwisowy ładuje moduł wyceny i nadpisuje wartości, moduły Sevice i Quotes są ładowane, a wartości są wylogowane –