我有一个基于数据库中的表行构建的对象。它具有在该条目中找到的所有属性以及几个 ko.computed,它们是条目字段和显示内容之间的中间层。我需要他们能够翻译某些字段值的外键。
问题如下:其中一个属性是字符串的 ID。我用计算出的 ID 检索该 ID。现在在计算中将有一个如下所示的值:'option1|option2|option3|option4'
我希望用户能够更改选项、添加新选项或交换它们,但我还需要监视用户正在做什么(至少在他添加、删除或移动一个属性时)。因此,我创建了一个可观察的数组,我将以一种允许我监视用户操作的方式绑定它。然后数组将订阅计算,因此它也会更新数据库中的值。
部分代码:
function Control(field) {
var self = this;
self.entry = field; // database entry
self.choices = ko.observableArray();
self.ctrlType = ko.computed({
read: function () {
...
},
write: function (value) {
if (value) {
...
}
},
owner: self
});
self.resolvedPropriety = ko.computed({
read: function () {
if (self.ctrlType()) {
var options = str.split('|');
self.choices(createObservablesFromArrayElements(options));
return str;
}
else {
return '';
}
},
write: function (value) {
if (value === '') {
//delete entry
}
else {
//modify entry
}
},
deferEvaluation: true,
owner: self
});
self.choices.subscribe(function (newValue) {
if (newValue.length !== 0) {
var newStr = '';
$.each(newValue, function (id, el) {
newStr += el.name() + '|';
});
newStr = newStr.substring(0, newStr.lastIndexOf("|"));
if (self.resolvedPropriety.peek() !== newStr) {
self.resolvedPropriety(newStr);
}
}
});
self.addChoice = function () {
//user added an option
self.choices.push({ name: ko.observable('new choice') });
};
self.removeChoice = function (data) {
//user removed an option
if (data) {
self.choices.remove(data);
}
};
...
}
这种组合有效,但不是我想要的。这是一种循环行为,触发次数过多。这给用户的操作带来了一些负担,因为对数据库有很多请求。
我错过了什么?或者有更好的方法吗?