同时更改太多的observable会导致浏览器崩溃

时间:2013-06-22 17:45:14

标签: knockout.js

我有75个选择框。它们中的每一个都被数据绑定到变量

MyModel.selectbox_1 = ko.observable(1);
MyModel.selectbox_2= ko.observable(2);
MyModel.selectbox_3= ko.observable(3);
MyModel.selectbox_4= ko.observable(3);
...
MyModel.selectbox_75= ko.observable(0);

每个选择框只有4个选项。

我希望能够根据用户对问题的回答来更改选择框。 例如,重置所有这些

var variable_name = "";
for (var i = 1; i < 76; i++) {
 variable_name = 'MyModel.selectbox_' + i;
 eval(variable_name)(0);
}

如果我这样做,浏览器会在几秒钟内没有响应,然后就可以了。

是否有更好的方法可以同时更改许多选择框?

可能与网络工作者在一起吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

你永远不应该使用eval

在这种情况下,你可以通过改变它来轻松避免它:

var variable_name = "";
for (var i = 1; i < 76; i++) {
    variable_name = 'MyModel.selectbox_' + i;
    eval(variable_name)(0);
}

致:

for (var i = 1; i < 76; i++) {
    MyModel['selectbox_' + i](0);
}

但是你应该考虑使用数组作为选择:

var i,
    Plan_Model = {
        plan_spread_options: ko.observableArray(['0', '1', '2', '3', '4']),
        selects: []
    };

// init
for (i = 0; i < 75; i++) {
    Plan_Model.selects.push(ko.observable(0));
}

// apply bindings
ko.applyBindings(Plan_Model, $("#plan_bilgileri")[0]);

// update
for (i = 0; i < Plan_Model.selects.length; i++) {
    Plan_Model.selects[i](2);
}

请参阅更新的fiddle(另请参阅简化的html)。