5

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?

11
  • possible duplicate of Using RequireJS, how do I pass in global objects or singletons around? Commented Aug 26, 2013 at 18:31
  • The first piece works as expected, as this fiddle shows, jsbin.com/ifeyefo/1 . There must be something wrong with your setup. Is this really the code you use, or a simplified example. Commented Aug 26, 2013 at 18:40
  • @Andreas Köberle, sorry, can't open the fiddle. It's approximately the code I'm using. Commented Aug 26, 2013 at 18:44
  • As I say, your example code works fine. Most of the time a required module is undefined, there is a circular reference between the modules. So does the first module requires also the second module in your real code. Commented Aug 26, 2013 at 18:49
  • @Andreas Köberle, sorry for missleading you, I made a mistake. Please, reread the question. I can query dataService.quotesArray, but if I set it in one module, and then query dataService.quotesArray in another module, I get empty array, seems like I haven't set quotes var in a first module Commented Aug 26, 2013 at 18:57

1 Answer 1

7

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/

Sign up to request clarification or add additional context in comments.

2 Comments

Are the dependencies load async without any order but executed in the order - service - quotes ?
The order would be: Quotes module is defined, Service module is defined, Service module loads Quotes module and overwrites values, Sevice and Quotes modules are loaded and the values are logged out

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.