2013-08-11 8 views
5

Ich habe folgendes erfordern js Setup für meine App:require.js - undefiniert Module als Argumente übergeben Rückruf definieren

app.js

require.config({ 
    paths: { 
     jquery: '../thirdparty/jquery-1.9.1.min', 
     moment: '../thirdparty/moment', 
     spinningwheel: '../thirdparty/datepicker/spinningwheel', 
     handlebars: '../thirdparty/handlebars', 
     colorgenerator: '../usercolors', 
     baseconfig: '../config'  }, 
    shim: { 
     'baseconfig': [], 
     'spinningwheel': { 
      deps: [], 
      exports: 'SpinningWheel' 
     }, 
     'handlebars': { 
      deps: [], 
      exports: 'Handlebars' 
     } 

    } 
}); 


require(['jquery', 'dom', 'helpers', 'actions', 'history', 'store'], function ($, dom, helpers, actions, hist, store) { 
    //all good on the home front at this point 
    //all modules loaded properly 
    history.render(); 
}) 

history.js

define(['renderview'], function (renderview) { 
    //all good here, render view is loaded properly 
    return { 
     render: function() { 
      renderview({...}); 
     } 
    }; 
}) 

renderview.js

0 So
define(['jquery', 'helpers', 'dom'], function ($, helpers, dom) { 
    function renderView(view) { 
     var template = helpers.getTemplate(); //ERROR: helpers is undefined! 
    } 

    return renderView; 
}); 

helpers.js

define(['jquery', 'handlebars', 'history', 'dom', 'colorgenerator'], function ($, Handlebars, history, dom, ColorGenerator) { 
    var helpers = {}; 

    helpers.getTemplate = function() { 
     //do stuff 
    }; 

    return helpers; 
}); 

, wie Sie sehen können, ist Helfer geladen ganz gut in die inital app.js Rückruf, aber wenn ich in renderview.js bekommen, ist es nicht definiert. Die Abhängigkeitsfelder im Beispiel sind genau das, was ich in meinem tatsächlichen Code habe, aber ich habe alle scheinbar irrelevanten Code redigiert. Irgendwelche Ideen, warum Helfer in app.js, aber nicht in renderview.js gut geladen würden? Ist das eine zirkuläre Abhängigkeit? Sieht mir nicht danach aus, aber vielleicht bin ich heute schon zu lange dabei :)

Danke für jede Hilfe oder Vorschläge!

aktuelle Lösung Hinzufügen, obwohl ich weiß nicht, warum ich es auf diese Weise tun müssen :)

define(['require', 'jquery', 'dom'], function (require, $, dom) { 
    function renderView() { 
     //responsible for rendering our view 
     var helpers = require('helpers'); 
     var history = require('history'); 

     var v = history.get(); 
     ... 
     tmpl = helpers.getTemplate(v.template); 
     ... 
    } 

    return renderView; 
}); 

Also, ich nicht diese Module ordnungsgemäß geladen bekommen könnte, ohne die innen erfordern zu tun Callback, anstatt sie als Abhängigkeit anzugeben. Ich würde gerne einen Einblick, warum das ist ...

+0

In dem nicht verwässerten Code haben Helfer eine getTemplate Methode? – Josh

+0

jawohl. Ich werde für Klarheit bearbeiten. In der renderview.js ist das Argument ** helpers ** nicht definiert, nicht nur diese Funktion. – Greg

+0

Das funktioniert, aber ich bin mir nicht sicher, warum ich diesen Fix implementieren musste. Ich musste am Ende das "require" -Modul anfordern und dann "requires ('helpers')" aus der renderview-Funktion heraus tun. Nicht sicher warum, aber das scheint die Dinge funktionieren zu lassen. – Greg

Antwort

1

Angesichts des Problems und Ihrer Lösung sieht es so aus, als ob Sie eine circular dependency irgendwo in Ihrem erfordern Anrufe haben. Möglicherweise benötigen einige der Module, die Sie im Modul helper benötigen, auch das Modul helpers.

+3

Wenn das stimmt, sollte es nicht protokolliert werden? – user239558

Verwandte Themen