ค้นหาเว็บไซต์

hottowel (durandal) + typescript


นี่คือโพสต์แรกของฉัน ดังนั้นขอให้ฉันโชคดีนะ :)

ฉันต้องการใช้ผ้าขนหนูร้อน (durandal) + typescript ฉันได้ติดตามกระทู้เหล่านี้: - how-can-i-use-a-class-for-my-shell-viewmodel-in-durandal - how-to-use-fancybox-in-combination-with-durandal-en-typescript - incorrect-this-in-select

และยังได้ลองตัวอย่าง DurandalTypescriptExample ด้วย

ตัวอย่างนี้ไม่สามารถรันได้กับข้อผิดพลาดนี้:

เกิดข้อผิดพลาดของเซิร์ฟเวอร์ในแอปพลิเคชัน '/'

ไม่สามารถหาทรัพยากรได้.

ตอนแรกฉันตัดสินใจที่จะเปลี่ยน viewmodels ของฉันด้วย typescript ก่อน และหลังจากนั้นก็จะทำกับ shell ด้วย แต่ในทั้งสองกรณีฉันได้รับข้อผิดพลาดนี้:

นี่คือโค้ด shell.ts ของฉัน (ซึ่งฉันใช้จากตัวอย่างนี้) :

/// <reference path="../durandal/durandal.d.ts" />

import _router = module('durandal/plugins/router');
import app = module('durandal/app');

export var router = _router;

export function search() {
    app.showMessage('Search not yet implemented...');
}
export function activate() {
    return router.activate('welcome');
}

และฉันได้รับข้อผิดพลาดนี้:

- JavaScript runtime error: 'exports' is undefined

มีไอเดียไหม?

และถ้าเป็นไปได้ จะขอบคุณสำหรับวิธีแก้ไขที่ใช้ได้จริง

ขอบคุณครับพวกเรา มาดูกันว่าจะเกิดอะไรขึ้น

คำตอบ #1

ฉันมีปัญหาเดียวกันกับ DurandalTypescriptExample อย่างไรก็ตาม โค้ดในโปรเจกต์นี้แสดงให้เห็นว่าคุณสามารถนำโค้ด typescript ของคุณไปใช้งานในไฟล์ viewmodel ได้อย่างไร ถ้าคุณเพียงแน่ใจว่าจะทำการ dispose ตัวแปรที่ Durandal ต้องการอย่างเป็นสาธารณะ อย่างน้อยฟังก์ชัน activate และตัวแปร title

ดูตัวอย่างโค้ดด้านล่าง:

/// <reference path="../../dts/knockout/knockout.d.ts" //>
export class ViewModel {
    title: string =  'Home View';
    MyTitle: KnockoutObservableString; //MyTitle can be referenced in home.html as vm.MyTitle
    public activate() {
         this.MyTitle = ko.observable(this.title + " with my ko title");
         return true;
    }
}

export var vm = new ViewModel();
//The Durandal plugin-interface variables
export var title = vm.title;
export var activate = function () { return vm.activate(); };

เนื่องจากฉันไม่พบโครงการที่สร้างไว้ล่วงหน้าเพื่อสาธิตเรื่องนี้ ฉันจึงต้องสร้างของตัวเอง ดูเวอร์ชันของฉันของโครงการ Hot Towel บน GitHub:

https://github.com/Svakinn/TypeTowel

คำตอบ #2

ถ้าคุณส่งออกบางอย่างในสโคประดับโลก คุณอยู่ในพื้นที่โมดูลภายนอกและคุณต้องใช้ไลบรารีของบุคคลที่สามเพื่อจัดการโมดูลของคุณ

ผมแนะนำให้คุณใช้ RequireJS โดยพื้นฐานดังต่อไปนี้ใน TypeScript:

export function f(){
}

สร้าง js ต่อไปนี้:

function f() {
}
exports.f = f;

`exports` เป็นตัวแปรที่ถูกกำหนดโดยตัวโหลดโมดูลของบุคคลที่สาม หากคุณไม่มีตัวโหลดโมดูลดังกล่าว ตัวแปร exports จะไม่ถูกกำหนด บทเรียนของฉันได้อธิบายเรื่องนี้เพิ่มเติม

บทความที่เกี่ยวข้อง