关闭KnockoutJs的问题

时间:2014-01-21 12:10:14

标签: javascript knockout.js closures

这里似乎有一个闭包问题:http://jsfiddle.net/vtortola/NMHQ6/

代码在屏幕上添加了一些条形图,它应该减小所有条形图的大小,但它只发生在最后一条。

var bar = function(start){
    me = {};
    me.width = ko.observable(start);

   var countDown = function(milliseconds, step, callback){
        callback(milliseconds);
        if(milliseconds>0)
            setTimeout(function(){ countDown(milliseconds-step,step,callback);}, step+10);
    };

   countDown(start, 1, function(m){me.width(m); });

    return me;
}

var viewModel = function(){
    var me ={};
    me.bars = ko.observableArray();
    for(var i=0;i<20;i++){
        me.bars.push(bar(300));
    }
    return me;
}

ko.applyBindings(viewModel);

但我找不到问题。

1 个答案:

答案 0 :(得分:4)

您遗漏了var函数中的bar关键字,因此,您的me变量在全局范围内声明。出于这个原因,并且因为在javascript对象中通过引用传递,所以me.bars填充了相同的content

一个简单的解决方法是:

var bar = function(start){
    var me = {};
    me.width = ko.observable(start);

   var countDown = function(milliseconds, step, callback){
        callback(milliseconds);
        if(milliseconds>0)
            setTimeout(function(){ countDown(milliseconds-step,step,callback);}, step+10);
    };

   countDown(start, 1, function(m){me.width(m); });

    return me;
}

希望它有所帮助。