1

알았어. 조금 배경이 있는데, Visual Studio의 새로운 멀티 장치 하이브리드 앱 프로젝트 설정을 사용하여 kendo-mobile을 typescript와 함께 사용하려고합니다. 검도 응용 프로그램의 초기화를하여 MyApplication 생성자 내에서 무슨 일이 일어나고글로벌 앱 변수가 계속 정의되지 않은 상태로 되돌아옵니다.

/// <reference path="../typings/require.d.ts" /> 

import MyApplication = require('../app/MyApplication'); 
var App: MyApplication; 

document.addEventListener("deviceready", function() 
{  
    App = new MyApplication(); 
}, false); 

: 나는 다음과 같은 코드가 포함 된 파일 이름 main.ts 있습니다. 또한 동일한 생성자에서 초기보기로 전달하여 검도 응용 프로그램에서 먼저 표시 할보기를 알 수 있도록합니다. 아래는 MyApplication 클래스의 코드입니다.

/// <reference path="../typings/require.d.ts" /> 

import PrimaryController = require("../app/controllers/PrimaryController"); 

class MyApplication 
{ 
    KendoApp: kendo.mobile.Application; 
    PrimaryController: PrimaryController; 

    constructor() 
    { 
     this.InitializeControllers(); 
     this.InitializeKendoApp(); 
    } 

    private InitializeControllers() 
    { 
     this.PrimaryController = new PrimaryController(this); 
    } 

    private InitializeKendoApp() 
    { 
     var appOptions: kendo.mobile.ApplicationOptions = {}; 
     appOptions.initial = this.PrimaryController.View; 
     appOptions.layout = "app-layout"; 
     appOptions.transition = "slide"; 

     this.KendoApp = new kendo.mobile.Application($(document.body), appOptions); 
    } 
} 

export = MyApplication; 

그래서 내 index.html을에서 나는 또한 main.js를 호출하고 내 글로벌 앱 변수를 인스턴스화해야 requirejs이 전화를 가지고있다.

data-show="App.PrimaryController.OnViewShow" 

때 데이터 쇼 속성을 : 나는 다음과 같이 내가 데이터 쇼 속성을 설정 한 주요 사업부에 (primaryview.html)을 표시하려고 뷰에서 이제

<script src="scripts/frameworks/require.js" data-main="scripts/app/main.js"></script> 

"Undefined"의 'PrimaryController'속성을 읽을 수 없다는 오류가 나타납니다. 즉, 전역 App 변수가 인스턴스화되지 않습니다.

데이터 표시 특성을 제거하면 primaryview.html이 예상대로 표시되고 앞서 언급 한 것처럼 MyApplication의 생성자 내에서 초기 뷰를 설정하기 때문에 App 변수가 인스턴스화됩니다. 인스턴스화의 발생 여부는 main.ts에 중단 점을 설정했기 때문에 의심 스럽지만 데이터 표시가 제거되고 뷰가 표시되는 경우에도 절대 중단되지 않습니다.

누구든지 여기에 무슨 일이 일어나고 있는지 아이디어가 있습니까? 아마도 main.ts에 require.config()를 호출해야 할 필요가 있다고 생각했고 인터넷 검색에서 찾은 예제를 사용하여 설정했지만 아무 것도 작동하지 않았습니다. 즉시 당신이 당신의 파일이 파일에 define 및 글로벌 변수에 싸여이되는 수입 성명을 발표로

답변

3

그래서 window에 더 이상 글로벌 즉 사용할 수 없습니다 :

import MyApplication = require('../app/MyApplication'); 
var App: MyApplication; 

응용 프로그램이 아닙니다 창에.

당신은 창에 넣을 불구하고 다음 작업을 수행 할 수 있습니다

document.addEventListener("deviceready", function() 
{  
    (<any>window).App = new MyApplication(); 
}, false); 
+1

당신에게 친구를 주셔서 감사합니다! 나는 그것을 시도 했었지만 (캐스팅없이) app 속성이 창에 존재하지 않았지만 캐스트가 완전히 그 문제를 처리하기 때문에 빌드되지 않습니다. 나는 캐스트를 할 생각은 결코 없었을거야. 나는 우리가 감사를 위해 이러한 주석을 사용하지 않을 것을 알고 있지만 지옥에 - 감사합니다 감사합니다! –

+0

@ RollTide73의 코멘트는이 모든 것을 가치있게 만듭니다;) – basarat

관련 문제