2013-08-22 72 views
2

目前我正在致力於Durandal 2.0項目。 最初我使用這個JavaScript代碼來執行我的shell.js(ViewModel),它工作得很好。TypeScript中JavaScript的等效

初始JavaScript代碼(工作一個)

define(['plugins/router', 'durandal/app'], function (router, app) { 

    return { 
     router: router, 
     search: function() { 
      app.showMessage('Search not yet implemented...'); 
     }, 
     activate: function() { 
      router.map([ 
       { route: '', title:'Welcome', moduleId: 'viewmodels/welcome', nav: true }, 
       { route: 'flickr', moduleId: 'viewmodels/hello', nav: true } 
     ]).buildNavigationModel(); 

      return router.activate(); 
     } 
    }; 
    }); 

現在我嘗試使用打字稿。 所以我寫了這個代碼(下一個),這是不工作 打字稿代碼:

/// <reference path="../../Scripts/typescripts/jquery/jquery.d.ts" /> 
    /// <reference path="../../Scripts/typescripts/knockout/knockout.d.ts" /> 
    /// <reference path="../../Scripts/typescripts/durandal/durandal.d.ts" /> 

    import _config = require('config'); 
    import _router = require('plugins/router'); 
    import _app = require('durandal/app'); 

    class shell { 
    //config = new _config.Config(); 
    app = _app; 
    router = _router; 

    activate() { 
     this.router.map([ 
      { route: '', title: 'Welcome', moduleId: 'viewmodels/welcome', nav: true }, 
      { route: 'flickr', moduleId: 'viewmodels/hello', nav: true } 
      ]).buildNavigationModel(); 
      return this.router.activate(); 
     } 
    } 

打字稿的輸出: 由打字稿(不工作)生成的JavaScript代碼

/// <reference path="../../Scripts/typescripts/jquery/jquery.d.ts" /> 
    /// <reference path="../../Scripts/typescripts/knockout/knockout.d.ts" /> 
    /// <reference path="../../Scripts/typescripts/durandal/durandal.d.ts" /> 
    define(["require", "exports", 'plugins/router', 'durandal/app'], function(require, exports, ___router__, ___app__) { 

    var _router = ___router__; 
    var _app = ___app__; 

    var shell = (function() { 
     function shell() { 
      //config = new _config.Config(); 
      this.app = _app; 
      this.router = _router; 
     } 
     shell.prototype.activate = function() { 
      this.router.map([ 
       { route: '', title: 'Welcome', moduleId: 'viewmodels/welcome', nav: true }, 
       { route: 'flickr', moduleId: 'viewmodels/hello', nav: true } 
     ]).buildNavigationModel(); 
      return this.router.activate(); 
     }; 
     return shell; 
     })(); 
    }); 

任何人都可以告訴我什麼是問題? 我得到的錯誤是這樣的,

無法解析綁定。

綁定值:ATTR:{HREF:router.navigationModel()[0] .hash}

消息:路由器沒有定義;

查看:views/shells;

的moduleId:的ViewModels /殼

+0

你在編譯過程中遇到了什麼錯誤,以及你正在使用什麼版本的Typescript? –

+0

您不是從模塊返回外殼,只從構造函數返回。 – Tyrsius

回答

1

您的建議,感謝球員,但我必須在年底創建類的新實例解決了這個問題該代碼,這是工作正常。

 return new shell(); 

上面的行已經在課後添加了。

2

迪朗達爾期望從模塊返回的對象的實例。 Typescript的AMD約定是導出構造函數。討論這個問題,並解決插件在這裏:https://github.com/BlueSpire/Durandal/pull/244

我創建迪朗達爾V2.0插件來幫助解決問題:

https://gist.github.com/Jaben/6180861

它會發現查看和使用導出類如果可用。

您還需要標註「殼」類作爲出口的打字稿:

import _config = require('config'); 
import _router = require('plugins/router'); 
import _app = require('durandal/app'); 

export class shell { 
    //.... 
} 
+0

Durandal將使用實例或構造函數。看看這個[示例](https:// github。COM/BlueSpire /迪朗達爾/斑點/主/ SRC /樣品/應用/模態/ customModal.js)。 「出口」應該是他需要做的一切。 – Tyrsius

+0

問題在於Durandal解決TypeScript導出問題。這個問題是由Durandal的作者所熟知的,並在這裏概述:https://github.com/BlueSpire/Durandal/pull/13作者承認這個問題,甚至提出了我在這裏提供的相同解決方案(一個插件) 。請求與討論:https://github.com/BlueSpire/Durandal/pull/244 – Jaben

+0

這似乎很相關,你應該把它放在你的答案。 – Tyrsius