如果它尚未在knockout.js中设置为某个值,则仅更改observable

时间:2016-05-17 10:25:36

标签: javascript knockout.js knockout-2.0

我在knockout.js中有一个observable:

var test = ko.observable();

test({view: 'abc',model : 'newmodel'});

我想检查变量test是否已包含:

{view: 'abc',model : 'newmodel'}

如果没有,我想添加条目。使用knockout.js时如何检查?

困难的部分是了解对象细节。

1 个答案:

答案 0 :(得分:3)

您可以使用()检索可观察量的当前值。即:

var currentValue = test();

要检查它是否引用了同一个对象,您可以使用===运算符:

var newValue = { view: 'abc', model: 'newmodel' };
var isTheSame = currentValue === newValue;

请注意,当您设置一个可观察的值时,knockout已经检查新值是否与旧值实际不同。如果它们相同,则淘汰赛不会通知任何订阅者(除非您明确告知)。

如果你想比较对象是否包含相同的键和值,你需要某种"深度比较"方法。 (How to determine equality for two JavaScript objects?

我不确定你的意思"添加条目"。要设置新对象,请使用:

test(newValue);

如果您要将newValue变量中的属性添加到test的值,可以使用Object.assignmake sure to check if your browser supports it

var combinedValue = Object.assign(currentValue, newValue);
test(combinedValue);

Object.assign会映射其所有参数'第一个参数对象的键和值。它会使用最新参数的值覆盖任何重复的键。

E.g:

var test = ko.observable({ a: 1, b: 1 });
var newValue = { b: 2, c: 3 };
test(Object.assign(test(), newValue));

console.log(test()); // Will print: { a: 1, b: 2, c: 3 }