Dojo AMD: Can't call a function inside a require

后端 未结 3 352
夕颜
夕颜 2020-12-31 08:49

I am really a newbie to dojo but as i started developing a new application with dojo version 1.7.2 i also wanted to use the new AMD syntax for functions. Unfortunately i don

相关标签:
3条回答
  • 2020-12-31 09:21

    Paul Grime gave you a good example, so I'm just sharing some thoughts.

    You don't define all the modules in each function, that's a huge waste of space. Although, even if you try to load a module multiple times, Dojo will only load it once anyway.

    This is a simplified module from my latest project, with quite meaningless functionality:

    //app module in 'my' folder
    
    define(
    [
        'app/elements',
        'dojo/query',
        'dojo/on',
        'dojo/fx',
        'dojo/_base/fx',
        'dojo/dom-construct',
        'dojo/_base/event'
    
        //and so on.....
    ], 
    
    function(elements, q, on, fx, baseFx, constr, event)
    {   
        return {
    
            init : function()
            {
                var node = q(elements.loading);
                this.removeNode(node);
    
                this.addEvents();
            },
    
            removeNode : function(node)
            {
                node.remove();
            },
    
            addEvents : function()
            {
                $(elements.buttons).on('click', function(e)
                {
                    alert(q(e).attr('id') + ' was clicked!');
                });
            }   
        }
    }
    

    Then I get the module by using

    define(
    [
        'my/app',
    ], 
    
    function (app) 
    {
        app.init();
    }
    
    0 讨论(0)
  • 2020-12-31 09:26

    Try this:

    require([...], function() {
        var myFunctions = dojo.getObject('myFunctions', true);
        myFunctions.createNewRow = function(...) {
            ...
        };
    });
    

    You can now call your functions from anywhere by using

    myFunctions.createNewRow();
    

    If you don't want 'myFunctions', you could do

    require([...], function() {
        var createNewRow = function(...) {};
    
        dojo.setObject('createNewRow', createNewRow);
    });
    
    0 讨论(0)
  • 2020-12-31 09:40

    The easiest way would be to define your own module. Take a look at this tutorial first:

    http://dojotoolkit.org/documentation/tutorials/1.7/modules/

    Now define your own module, e.g. "./js/mymodules/mymodule.js" (relative to HTML page):

    define([
        "dojo/dom-construct",
        "dojo/dom-attr",
        "dijit/form/FilteringSelect",
        "dojo/data/ItemFileReadStore",
        "dijit/form/ComboBox",
        "dijit/form/DateTextBox",
        "dijit/form/Select",
        "dojo/store/Memory"
    ], function (domConstruct, domAttr, FilteringSelect, ItemFileReadStore, ComboBox, DateTextBox, Select, Memory) {
    
        function fillReportTable(repId) {
           // a lot of code to create the table, consisting of SEVERAL functions 
           function createNewRow(tbl) { ...} 
           function function1 () {... } 
           function function2 () {... } 
           function function3 () {... } 
        }
    
        function addEmptyRow() {
           // a lot of code to create the table, consisting of SEVERAL functions
        }
    
        // Return an object that exposes two functions
        return {
            fillReportTable: fillReportTable,
            addEmptyRow: addEmptyRow
        }
    
    });
    

    And use your module like this:

    <html>
    
    <head>
    
    <script>
    var dojoConfig = {
        baseUrl: "./js/",
        packages: [
            { name: "dojo", location: "lib/dojo" },
            { name: "dijit", location: "lib/dijit" },
            { name: "dojox", location: "lib/dojox" }
        ]
    };
    </script>
    
    <script data-dojo-config="async: true" src="js/lib/dojo/dojo.js"></script>
    
    </head>
    
    ...
    
    <script>
    require([
        "mymodules/mymodule"
    ], function (mymodule) {
        mymodule.fillReportTable(...);
        mymodule.addEmptyRow(...);
    });
    </script>
    
    0 讨论(0)
提交回复
热议问题