2

練習として、次のコードをcoffeescriptに翻訳しようとしています

function StateVM() {
    var self = this;

    self.state = ko.observable("stopped");
    self.counter = ko.observable(0);
    self.timeStopped = ko.observable(new Date());
    self.timeStarted = ko.observable(new Date());
    self.currentTime = ko.observable(new Date());
    self.timeRunning = ko.computed(function(){
        var num = (self.currentTime() - self.timeStarted())/1000 >> 0;
        return (num < 0) ? 0 : num;
    });

    self.isStopped = ko.computed(function(){
        return (self.state() === "stopped");
    });

    self.isStarted = ko.computed(function(){
        return (self.state() === "running");
    });

$(document).ready(function(){
    var vm = new StateVM();
    ko.applyBindings(vm);
});

今、私はこのコードをcoffeescriptに持っていますが、自己参照@が間違ったスコープにコンパイルされるという問題に遭遇しています:

obs = ko.observable
cmp = ko.computed

class StateVM
    constructor: ->
        state = obs "stopped"
        counter = obs 0
        timeStopped = obs new Date
        timeStarted = obs new Date
        currentTime = obs new Date
        timeRunning = cmp -> 
            x = (@currentTime() - @timeStarted())/1000 >> 0
            x < 0 ? 0 : x

        isStopped = cmp -> @state() == "stopped"
        isStarted = cmp -> @state() == "running"

$ -> ko.applyBindings(new StateVM)

これを行う標準的な方法はありますか?

4

1 に答える 1

2

わかりました...検索を行った後、機能しました。

https://groups.google.com/forum/?fromgroups=#!topic/knockoutjs/CTBLQthLGWU

私は2つのことをしませんでした...1つは@コンストラクター宣言にを追加しなかったことであり、もう1つは=>代わりにを使用することでした->

obs = ko.observable
cmp = ko.computed

class StateVM
    constructor: ->
        @state = obs "stopped"
        @counter = obs 0
        @timeStopped = obs new Date
        @timeStarted = obs new Date
        @currentTime = obs new Date
        @timeRunning = cmp => 
            x = (@currentTime() - @timeStarted())/1000 >> 0
            x < 0 ? 0 : x

        @isStopped = cmp => @state() == "stopped"
        @isStarted = cmp => @state() == "running"
        @start = (->) ;
        @stop = (->) ;

$ -> ko.applyBindings(new StateVM)
于 2012-09-20T21:34:04.407 に答える