只有在 knockout.js 中尚未设置某个值时才更改 observable

Only change observable if it's not already set to some value in knockout.js

我在 knockout.js 中有一个 observable:

var test = ko.observable();

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

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

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

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

困难的部分是了解对象的详细信息。

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

var currentValue = test();

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

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

请注意,当您设置一个 observable 的值时,knockout 已经检查新值是否真的与旧值不同。如果它们相同,knockout 将不会通知任何订阅者(除非您明确告知)。

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

我不确定 "add the entry" 是什么意思。要设置新对象,请使用:

test(newValue);

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

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

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

例如:

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 }