使用knockoutjs在数组中的项目中创建计算值

时间:2017-04-08 21:38:41

标签: javascript arrays knockout.js

我正在尝试将数组中的某些项目作为计时器事件的函数进行更新。但是我不知道如何在淘汰赛中做些什么......我觉得自己有点被淘汰了。

问题我认为很简单,也许我的做法是错误的,或者只是我得不到的东西。

更详细一点:

数组中的项目各自表示自'something'以来的时间,以防止从服务器重新加载,如您所见,我已经绑定到我已经定义的ko.computed(显示)函数,这应该是items.timeElapsed并添加自页面加载以来的时间,self.moreTimeElapsed()

html:

<div>
    <ul data-bind="foreach: counted">
        <li><span data-bind="text: name"></span> - <span data-bind="text: display"></span></li>
    </ul>
</div>

和ViewModel

<script type="text/javascript">
    function myViewModel() {
        var self = this;

        self.email = 'someone@example.com';

        var d = new Date();
        self.startTime = d.getTime();
        self.moreTimeElapsed = ko.observable(0);

        var items = [{"name":"counter1","timeElapsed":168},{"name":"counter2","timeElapsed":162}];
        for (i = 0; i < items.length; ++i)
        {
            items[i].display = ko.computed(function ()
            {
                return items[i].timeElapsed + self.moreTimeElapsed();
            })
        }
        self.counted = ko.observableArray(items);
        self.updateCounters = function () {
            var d = new Date();
            self.moreTimeElapsed(d.getTime() - self.startTime);
        }
        setInterval(self.updateCounters, 3000);
    };

    ko.applyBindings(new myViewModel());
    function Reload() {
        location.reload(true);
    }
</script>

任何提示或想法都值得赞赏。

1 个答案:

答案 0 :(得分:3)

问题是计数器'我'超出了范围。

我将代码包装在一个闭包中,解决了问题

    var items = [{"name":"counter1","timeElapsed":1706},{"name":"counter2","timeElapsed":1700}];

    var attachDisplayFunc = function(item) {
        item.display = ko.computed(function () {
            return item.timeElapsed + self.moreTimeElapsed();
        })
    }

    for (i = 0; i < items.length; ++i) {
        attachDisplayFunc(items[i]);
    }
    self.counted = ko.observableArray(items);

那么..有什么办法可以在发生错误时收到通知吗?