データベースのテーブル行に基づいて構築されたオブジェクトがあります。そのエントリにあるすべてのプロパティに加えて、エントリ フィールドと表示されるものの間の中間層であるいくつかの ko.computed があります。一部のフィールド値の外部キーを変換できるようにする必要があります。
問題は次のとおりです。プロパティの 1 つが文字列の ID です。計算された ID を取得します。計算された値は次のようになります: 'option1|option2|option3|option4'
ユーザーがオプションを変更したり、新しいオプションを追加したり、それらを交換したりできるようにしたいのですが、ユーザーが何をしているかを監視する必要もあります (少なくとも、1 つのプロパティを追加、削除、または移動するとき)。したがって、ユーザーのアクションを監視できるようにバインドする監視可能な配列を作成しました。次に、配列は計算されたものにサブスクライブするため、データベースの値も更新されます。
コードの一部:
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);
}
};
...
}
この組み合わせは機能しますが、私が望むようには機能しません。これは周期的な動作であり、トリガーの回数が多すぎます。データベースへの要求が多いため、これはユーザーのアクションに過負荷を与えています。
私は何が欠けていますか?または、それを行うより良い方法はありますか?