如何在knockout.js中使用property作为类来实现TypeScript类?

时间:2017-05-22 01:57:44

标签: javascript html asp.net-mvc typescript knockout.js

我是TypeScript的新手,我开始学习如何在TypeScript中使用knockout.js以及如何使用knockout.js创建一个viewmodel。这只是一个简单的例子,试图理解模块中的基本类,并且知道我能够使用Client类创建数据绑定,它正确地工作name和{{1}但是我有一个C#上下文,所以在C#中你可以创建一个类,如类

中的属性

例如在C#中你可以创建一个这样的类,创建一个类lastName的属性

Activity

所以我想用typescript和knockout重现类似的东西。所以这就是我正在尝试的但它没有工作public class Client { public string ClientName {get;set;} public Activity Activity {get;set;} } public class Activity { public string ActivityName {get;set;} } //And call this like c# but with typescript sort of Client client = new Client(); client.Activity = new Activity(); client.Activity.ActivityName = "Activity name"; “类”我无法得到它的属性和方法。

activity

这就是我正在测试的简单html

module Crm {
    export class Client {
        name: KnockoutObservable<string>;
        lastName: KnockoutObservable<string>;
        activity: KnockoutObservable<Activity>;
        getName() {
            return alert(this.name()); //working correctly on the view
        }
        //constructor(name:string, lastName:string) {
        constructor(){
            this.name = ko.observable("");
            this.lastName = ko.observable("");
            this.activity = ko.observable(new Activity());
        }
    }

    export class Activity {
        id: KnockoutObservable<number>;
        names: KnockoutObservable<string>;
        description: KnockoutObservable<string>;
        date: KnockoutObservable<any>;
        getActivityName() {
            return alert("Actividad: " + this.description()); //not working
        }
        constructor() {
            this.id = ko.observable(0);
            this.names = ko.observable("");
            this.description = ko.observable("");
            this.date = ko.observable("");
        }
    }

    var a = new Client();
    console.log(a);
    ko.applyBindings(new Client());
}

客户端正在运行,但活动却没有。我不知道我是否以错误的方式尝试这种方式。

1 个答案:

答案 0 :(得分:1)

getActivityName的绑定上下文是Client对象,因此您有错误的this对象。

  1. 当前绑定模型作为第一个参数传递给click函数。
  2. 您可以使用固定代码检查fiddle

    getActivityName(client: Client) {
        return alert("Actividad: " + client.activity().description());
    }
    
    1. 您还可以通过with绑定更改当前绑定上下文:
    2. ```

      <!-- ko with: activity -->
      <input type="text" data-bind="description" />
      
      <button data-bind="click: getActivityName">Try me</button>
      <!-- /ko -->
      

      ```

      您可以在this fiddle中看到这种方法。