Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to share data between different modules in requirejs, javascript

I want to share some data between different modules by creating one module, called for instance dataService, put a variable into it, and then insert this module in other modules as a dependency. Here is the code (that doesn't work):

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?
});

Here is the workaround:

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();
});

I'm just wondering if it is a proper way to make some data be accessible in different modules?

And why first option doesn't work?

like image 547
Aleksei Chepovoi Avatar asked Aug 26 '13 18:08

Aleksei Chepovoi


1 Answers

To make this work you need to create an instance of both, so one overwrites the properties of the other:

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]
});

Here's a working fiddle: http://jsfiddle.net/kmturley/aHgMJ/

like image 165
Kim T Avatar answered Oct 22 '22 00:10

Kim T