Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从另一个dojo模板小部件调用dojo模板小部件中的函数_Javascript_Dojo - Fatal编程技术网

Javascript 从另一个dojo模板小部件调用dojo模板小部件中的函数

Javascript 从另一个dojo模板小部件调用dojo模板小部件中的函数,javascript,dojo,Javascript,Dojo,我需要从另一个dojo模板小部件调用dojo模板小部件中的函数。问题是,我需要像调用静态函数一样调用此函数,而不创建模板的新实例-是否仍要这样做?在我的应用程序中,模板1是datagrid,模板2是通过单击datagrid中的行打开的表单。我需要根据表单中采取的操作刷新datagrid 谢谢 Start Page: <!DOCTYPE html> <html > <head> <meta name="viewport" content="init

我需要从另一个dojo模板小部件调用dojo模板小部件中的函数。问题是,我需要像调用静态函数一样调用此函数,而不创建模板的新实例-是否仍要这样做?在我的应用程序中,模板1是datagrid,模板2是通过单击datagrid中的行打开的表单。我需要根据表单中采取的操作刷新datagrid

谢谢

   Start Page:

<!DOCTYPE html>
<html >
<head>
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <link rel="stylesheet" href="http://js.arcgis.com/3.10/js/dojo/dijit/themes/claro/claro.css">
   <link rel="stylesheet" href="http://js.arcgis.com/3.10/js/esri/css/esri.css">

  <script>
    var dojoConfig = {
    parseOnLoad:true,
    async: true,
    isDebug:true,
    packages: [
     {name: "Scripts", location: location.pathname.replace(/\/[^/]+$/, "") + "/Scripts"}
    ]

};
</script>
  <script src="http://js.arcgis.com/3.10/"></script>

    <script>
        require(["Scripts/Mod1", "Scripts/Mod2"],
        function (Mod1, Mod2) {
            M1 = new Mod1();
            M1.M1Method("call from main page");
           // Mod1.M1Method("call from main page");//any way to make so this could work like static function?
        });
    </script>
</head>
<body class="claro">
    <div>look here you</div>
</body>
</html>
模板2:

define(["require", "dojo/_base/declare", "dijit/_WidgetBase"],
 function (require, declare, _WidgetBase) {
     return declare([_WidgetBase], {
         M2Method: function (msg) {
             alert(msg);
             try {
                 require(["Scripts/Mod1"], function (Mod1) {
                     M1 = new Mod1();
                     M1.M1Method2("call from Mod2");
                     //Mod1.M1Method2("call from Mod2");//any way to make so this could work like static function?
                 });
             } catch (dohObj) {
                 alert(dohObj.message);
             }
         }
     }
 )
 }
);

我不完全确定你们的实际问题是什么,但若你们想创建静态方法,那个么是的,这是可能的。只需在declare语句后添加它们,如下所示:

var M1 = declare([_WidgetBase], {
    /** Your code */
});
M1.M1Method = function(msg) {
    /** Your static method */
};
return M1;
/** An object containing your "static methods" */
var statics = {
    static: function (msg) {
        console.log("Static:" + msg);
    }
};

/** Your actual prototype */
var M1 = declare([], lang.mixin({
    nonStatic: function (msg) {
        console.log("Non static:" + msg);
    }
}, statics));
/** Mixin the statics */
lang.mixin(M1, statics);
return M1;
但是,请注意,如果创建静态方法,则在创建实例时该方法不可用,例如,以下方法将起作用:

M1.M1Method("test");
但这将不再有效:

var m = new M1();
m.M1Method("test");
如果您想创建一个既可作为原型的一部分又可作为静态方法使用的方法,那么您可以编写如下内容:

var M1 = declare([_WidgetBase], {
    /** Your code */
});
M1.M1Method = function(msg) {
    /** Your static method */
};
return M1;
/** An object containing your "static methods" */
var statics = {
    static: function (msg) {
        console.log("Static:" + msg);
    }
};

/** Your actual prototype */
var M1 = declare([], lang.mixin({
    nonStatic: function (msg) {
        console.log("Non static:" + msg);
    }
}, statics));
/** Mixin the statics */
lang.mixin(M1, statics);
return M1;
因此,我们在这里使用dojo/_base/lang::mixin将静态对象混合两次,首先我们使用它将其混合到原型中,这样当您有一个实例时仍然可以访问该方法,然后我们也将其混合到结果中

我在JSFIDLE上设置了一个基本示例: