Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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加载自定义Typescript类无效_Javascript_Typescript_Dojo_Requirejs_Arcgis Js Api - Fatal编程技术网

Javascript 通过dojo加载自定义Typescript类无效

Javascript 通过dojo加载自定义Typescript类无效,javascript,typescript,dojo,requirejs,arcgis-js-api,Javascript,Typescript,Dojo,Requirejs,Arcgis Js Api,我有一个自定义类,我想开始使用Dojo加载程序。我似乎很接近,但注射什么似乎有问题 我的dojoConfig指向正确的脚本,这工作正常。如果typescript文件只包含语句,它就工作了,它会触发它所包含的任何内容 var dojoConfig = { packages: [ { name: "Viewer", location: "/scripts", main: "Viewer" } ], parseOnLoad: false }; 这是我引入自定义

我有一个自定义类,我想开始使用Dojo加载程序。我似乎很接近,但注射什么似乎有问题

我的dojoConfig指向正确的脚本,这工作正常。如果typescript文件只包含语句,它就工作了,它会触发它所包含的任何内容

var dojoConfig = {
    packages: [
        { name: "Viewer", location: "/scripts", main: "Viewer" }
    ],
    parseOnLoad: false
};
这是我引入自定义类的代码。虽然我说过如果typescript只是语句就可以了,但是当typescript是一个类时,我调用构造函数的那一行没有错误,但它也不起作用。当我设置一个断点并检查viewer变量时,它有一些与arcgis相关的属性,这使我相信注入有问题

我需要构造它,因为我需要在启动时传递变量。否则这真的不会成为问题

        require([
            "esri/map",
            "esri/dijit/ElevationProfile",
            ...
            "dojo/domReady!",
            "Viewer"
        ], function(Map, ElevationsProfileWidget, Viewer) {
            Loader(Map, ElevationsProfileWidget, Viewer);
        });

        function Loader(Map, ElevationsProfileWidget, Viewer) {
            ...
            var viewer = new Viewer(false, false);
        }
这是上下文的typescript类

import TopNavToolbar = require("./TopNavToolbar");
import IdentifyTool = require("./IdentifyTool");

class Viewer
{
    topToolbar: TopNavToolbar;

    constructor(public AddMeasure: boolean, public AddIdentify: boolean) {

        console.log("constructed");
    }
}
export = Viewer;
这就是它创建的JS,如果需要的话

define(["require", "exports", "./TopNavToolbar", "./IdentifyTool"], function (require, exports, TopNavToolbar, IdentifyTool) {
    "use strict";
    var Viewer = (function () {
        function Viewer(AddMeasure, AddIdentify) {
            this.AddMeasure = AddMeasure;
            this.AddIdentify = AddIdentify;
            this.topToolbar = new TopNavToolbar('ulToolbar');
            console.log("constructed");
        }
        return Viewer;
    }());
    return Viewer;
});
//# sourceMappingURL=Viewer.js.map

最后它变成了一个可笑的小东西。我不知道require字符串的顺序必须与引入它们的函数参数的顺序相同。所以在本例中,domReady将绑定到查看器。一旦我将Viewer require移到ElevationProfileWidget的正下方,一切都按预期进行

require([
            "esri/map",
            "esri/dijit/ElevationProfile",
            "Viewer",
            "dojo/domReady!" 
        ], function(Map, ElevationsProfileWidget, Viewer) {
            Loader(Map, ElevationsProfileWidget, Viewer);
        });

        function Loader(Map, ElevationsProfileWidget, Viewer) {
            ...
            var viewer = new Viewer(false, false);
        }

那么你是在用老道场?《安魂曲》之前的道场向我们发出了巨大的光芒(我已经死了,严肃的《安魂曲》太棒了)?如果是这样,这意味着IIRC,您需要使用
dojo.declare
来注册您的类,而不是define。由于TypeScript不支持转换为特定于框架的dojo格式,因此需要手动编写类声明。您可能需要一些存根类型声明,但这并不难。您使用的是哪个版本的dojo?一些dijit需要过时的东西,至少在我上次使用它们的时候,在调试器中为map popupsLook之类的东西声明类,就在您调用
newvieviewer
并检查
Viewer
Viewer.prototype
之前。如果你没有你所期望的,并且如果语句工作正常,加载程序可能试图填充你的模块或者类似的奇怪的东西。谢谢Aluan,它最终是require字符串的顺序。我不知道这很重要,但这完全有道理。在阅读你的问题时,我完全忽略了这个错误。我的眼睛刚好跳过了引导代码,假设它是正确编写的,因为我已经看过很多次了。很高兴你让它工作了。