2015-06-26 78 views
2

我目前正在創建我淘汰賽的ViewModel這樣,使用Knockout將TypeScript類視爲ViewModel?

function MyViewModel() { 
    var self = this; 

    self.MyObservable = ko.observable(); 

} 

ko.applyBindings(new MyViewModel()); 

是否有使用這個打字稿類作爲視圖模型的方法嗎?

class MyViewModel { 

} 

我知道TSC最終會生成一個函數,但要堅持使用TypeScript約定我只想知道它是否可能?

感謝

+0

由於打字稿最終會被編譯爲JavaScript,爲什麼不呢?如果您正在尋找通過TypeScript公開的Knockout API,請參閱https://github.com/borisyankov/DefinitelyTyped/tree/master/knockout – haim770

回答

5

呀,在我的許多項目中,我使用的打字稿我KO的ViewModels的。 以下打字稿:

class MyViewModel { 
    MyObservable = ko.observable(); 
    MyComputed = ko.computed(() => { 
     return this.MyObservable() * 2; 
    }) 
} 

呈現以下有效視圖模型:

var MyViewModel = (function() { 
    function MyViewModel() { 
     var _this = this; 
     this.MyObservable = ko.observable(); 
     this.MyComputed = ko.computed(function() { 
      return _this.MyObservable() * 2; 
     }); 
    } 
    return MyViewModel; 
})(); 

使用功能雖然時要小心;以下打字稿功能:

MyFunction() { 
    if (this.MyComputed() > 4) { 
     alert('Higher than 4'); 
    } 
} 

將呈現:

MyViewModel.prototype.MyFunction = function() { 
    if (this.MyComputed() > 4) { 
     alert('Higher than 4'); 
    } 
}; 

這意味着你可能當你在你的例如(data-bind="click: MyFunction"會失敗)結合直接使用此功能碰上範圍問題this

爲了防止這些問題的範圍,你應該在聲明你的ViewModels的功能lambas:

MyFunction =() => { 
    if (this.MyComputed() > 4) { 
     alert('Higher than 4'); 
    } 
} 

呈現:

this.MyFunction = function() { 
     if (_this.MyComputed() > 4) { 
      alert('Higher than 4'); 
     } 
    }; 
+0

感謝我正在尋找的東西。 – shammelburg