Knockout计算的observable在更改其依赖关系时不会更新值
Knockout computed observable is not updating value when changing its dependencies
我一直在寻找解决方案,但在任何地方都找不到。我正试图创建一个ko.computed,它依赖于另外两个可观察性。每当可观察到的变化时,我都希望我计算出的可观察到也能更新,但事实并非如此。当我更改计算函数的任何依赖项时,它不会更新(视图+变量本身)。还有另一个可以与这个问题联系起来的问题。为什么"自我"变量是全球性的?即使我从AppViewModel中删除了它,它仍然是全局的。
这是一个简短的版本,下面你可以找到一个完整的工作示例的JSFiddle。当你按下"攻击"时,你的力量应该从5增加到1000,这反过来会将进度条"maxExp"值从0/6更新到一些高值0/500或其他值。
function AppViewModel() {
var self = this;
player = new playerTest();
enemies = new enemiesTest();
activeEnemy = new initializeFirstEnemy();
console.log('Call me more pls');
};
var baseStatsArray = ['Strength', 'Endurance', 'Speed', 'Luck'];
var currentEnemy = ko.observable(0);
function playerTest() {
var self = this;
var value;
var growth;
this.baseStats = {};
for (var i = 0; i < baseStatsArray.length; i++) {
var attr = baseStatsArray[i];
this.baseStats[attr] = {};
this.baseStats[attr]['value'] = ko.observable(5);
this.baseStats[attr]['growth'] = ko.observable(2);
this.baseStats[attr]['minExp'] = ko.observable(0);
this.baseStats[attr]['maxExp'] = ko.computed(function () {
return Math.floor((10 + (self.baseStats[attr]['value']() / 2)) / self.baseStats[attr]['growth']());
});
};
};
https://jsfiddle.net/tuswdahc/1/
问题是,您试图在循环中创建计算,由于闭包和变量作用域的工作方式,您没有创建正确的计算。
有关更多信息,请参阅:
- JavaScript闭包是如何工作的
- 不要在循环中生成函数
一些可能的解决方案:
使用ko.utils.forEach
或本机array.forEach
而不是for循环:
ko.utils.arrayForEach(baseStatsArray, function(attr) {
self.baseStats[attr] = {};
self.baseStats[attr]['value'] = ko.observable(5);
self.baseStats[attr]['growth'] = ko.observable(2);
self.baseStats[attr]['minExp'] = ko.observable(0);
self.baseStats[attr]['maxExp'] = ko.computed(function () {
return Math.floor((10 + (self.baseStats[attr]['value']() / 2)) /
self.baseStats[attr]['growth']());
});
});
将计算的创建移动到一个单独的函数中:
for (var i = 0; i < baseStatsArray.length; i++) {
var attr = baseStatsArray[i];
self.baseStats[attr] = {};
self.baseStats[attr]['value'] = ko.observable(5);
self.baseStats[attr]['growth'] = ko.observable(2);
self.baseStats[attr]['minExp'] = ko.observable(0);
self.baseStats[attr]['maxExp'] = createMaxExp(attr, self);
};
function createMaxExp(attr, self) {
return ko.computed(function () {
return Math.floor((10 + (self.baseStats[attr]['value']() / 2)) /
self.baseStats[attr]['growth']());
});
}
演示JSfiddle。
关于"全局"自身的问题:您没有正确创建视图模型,因为在调用applyBindings时缺少new
。
所以改变
ko.applyBindings(AppViewModel);
至
ko.applyBindings(new AppViewModel());
相关文章:
- Javascript循环不会自我更新
- 添加文字和评论功能更新Div
- AngularJS:ng之后,重复$scope值未按预期更新
- 如何通过数组更新角度子范围
- Ajax聊天消息重复而不仅仅是更新
- 通过CSV文件上载更新数据库表
- 平均值:无法将数据更新到数据库
- $rootScope未使用forEach进行更新
- d3基于用户选择动态更新节点
- 有条件更新d3.js力图中节点的最佳方法
- sugarcrm REST 更新 关系 beteen 联系人和帐户 javascript
- Ember js - 更新其他表后,有许多关系中断
- 主干关系未更新
- emberJS 2:用于操作的嵌套关系资源(更新和删除)
- 在 Ember 中保存预订时更新具有关系的现有事件
- Knockout计算的observable在更改其依赖关系时不会更新值
- react js和rails在具有活动记录关系的组件上更新状态
- 如何在Neo4j中使用cypher查询更新关系细节
- 通过本机select元素更新belongsTo关系
- 如何更新ember-data中的关系