13

私は本当にdojoの初心者ですが、dojoバージョン1.7.2で新しいアプリケーションの開発を始めたとき、関数に新しいAMD構文を使用したいとも思っていました。残念ながら、私はそれを取得していないようです。:-(

私が最も悩むのは、「require」ブロック内にある関数を単純に呼び出すことができないことです。たとえば、開くと、各行にいくつかのウィジェットがある動的テーブルを作成するページがあります。次に、押すたびに1つの空の行を追加するボタンがあります。

AMD構文がなければ、簡単です
。-すべての「dojo.require()」をHEADに配置
し、テーブルとウィジェットを作成するための独自の関数を作成します
。行の追加関数は、任意のグローバル変数に簡単にアクセスできます。以前の機能がいっぱいになりました

しかし、AMDでは次のようになります。

初期関数はテーブルとウィジェットを作成します:

function fillReportTable(repId) {
require(["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) {
   // a lot of code to create the table, consisting of SEVERAL functions 
   function createNewRow(tbl) { ...} 
   function function1 () {... } 
   function function2 () {... } 
   function function3 () {... } 
}

これで、「空の行を追加」ボタンが独自の関数「addEmptyRow」を呼び出します。
しかし、この関数では、次のことを
行う必要があります。-各dojo-moduleに対して他のrequireを再度実行します
-「fillReportTable」関数の「内部」にある関数は使用できません。たとえば、「createNewRow」関数

 function addEmptyRow() {
require(["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) {
// a lot of code to create the table, consisting of SEVERAL functions
}

これはすべてAMDでは非常に複雑なようです。
または、ここで明らかな何かが欠けていますか?
AMDでは、コードを多くの小さな関数に分割する場合、各関数内で「必須」をもう一度やり直しますか?または、完全なリストを含む1つの「必須」内にすべての機能を配置しますか?
2番目の方法で行う場合、ウィジェットイベントからこれらの関数をどのように呼び出すことができますか?

4

3 に答える 3

11

最も簡単な方法は、独自のモジュールを定義することです。最初にこのチュートリアルを見てください:

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

次に、独自のモジュールを定義します。たとえば、「。/ js / mymodules / mymodule.js」(HTMLページに対して):

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
    }

});

そして、次のようにモジュールを使用します。

<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>
于 2012-03-09T15:29:06.213 に答える
4

これを試して:

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

を使用して、どこからでも関数を呼び出すことができるようになりました

myFunctions.createNewRow();

'myFunctions'が必要ない場合は、

require([...], function() {
    var createNewRow = function(...) {};

    dojo.setObject('createNewRow', createNewRow);
});
于 2012-03-09T02:28:51.563 に答える
3

ポールグライムはあなたに良い例を与えたので、私はいくつかの考えを共有しています。

各関数ですべてのモジュールを定義するわけではありません。これはスペースの大きな浪費です。ただし、モジュールを複数回ロードしようとしても、Dojoはモジュールを1回しかロードしません。

これは私の最新のプロジェクトからの単純化されたモジュールであり、まったく意味のない機能を備えています。

//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!');
            });
        }   
    }
}

次に、を使用してモジュールを取得します

define(
[
    'my/app',
], 

function (app) 
{
    app.init();
}
于 2012-03-09T20:06:56.583 に答える