Вычисленное значение Knockout.js не обновляет пользовательский интерфейс

У меня есть цикл, который изменяет наблюдаемую переменную Knockout, которая используется в вычисляемой переменной. У меня есть диапазон, привязанный к этой вычисляемой переменной. Когда я запускаю его, пользовательский интерфейс этого диапазона не меняется. Целочисленные значения отправляются на консоль, поэтому я знаю, что вычисляемая переменная обрабатывается.

Вот мой JS:

var PlayerViewModel = function () {
    var self = this;

    self.NumberOfLoops = ko.observable(0);
    self.StartLoopTime = ko.observable(new Date());

    self.LoopsPerMinute = ko.computed(function () {
        var a = self.NumberOfLoops();
        var b = new Date() - self.StartLoopTime();
        var c = a / ((b) / 60000);
        var d = Math.round(c);
        console.log(d);
        return d;
    });

    self.Loop = function () {
        //..Stuff..

        var count = self.NumberOfLoops();
        count = count + 1;
        self.NumberOfLoops(count);

        //..More Stuff..
        //Call self.Loop again
    };
}

HTML:

<span data-bind="text: LoopsPerMinute">0</span>

У меня есть другие элементы DOM, привязанные к другим наблюдаемым и вычисляемым в PlayerViewModel, и они работают. Разве этот текст не должен автоматически меняться во время работы цикла. В настоящее время это не так.

Любая помощь приветствуется! Спасибо!


person user2653364    schedule 26.10.2013    source источник
comment
Ваш console.log срабатывает?   -  person PW Kad    schedule 27.10.2013
comment
Да, я получаю кучу целых чисел в консоли.   -  person user2653364    schedule 27.10.2013
comment
Ваш код кажется, работает для меня.   -  person Jeroen    schedule 27.10.2013
comment
Проблема где-то в коде, который вы не показали, поскольку скрипка Jeroen показывает, что пользовательский интерфейс действительно обновляется, когда вы вручную запускаете Loop(). Покажите код, который на самом деле вызывает его (кстати, общее соглашение JavaScript гласит, что имена функций не должны начинаться с заглавных букв, если только они не являются конструкторами, которые необходимо вызывать с помощью new).   -  person ebohlman    schedule 28.10.2013


Ответы (1)


Ты можешь это сделать

self.Loop = function () {
    //..Stuff..

    var count = self.NumberOfLoops();
    count = count + 1;
    self.NumberOfLoops(count);

    //..More Stuff..
    setTimeout(function()
    {
       self.Loop();
    }, 0)
};    

ДЕМО JSFiddle

В этом случае представление будет обновляться каждый раз при изменении self.NumberOfLoops.

person Ilya    schedule 27.10.2013