【问题标题】:Only change observable if it's not already set to some value in knockout.js仅当它尚未在 knockout.js 中设置为某个值时才更改 observable
【发布时间】:2016-05-17 10:25:35
【问题描述】:

我在 knockout.js 中有一个 observable:

var test = ko.observable();

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

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

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

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

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

【问题讨论】:

  • 我建议将您的标题更改为例如“仅当它尚未在 knockout.js 中设置为某个值时才更改 observable”,因为这与 调试 AFAICT没有任何关系。

标签: javascript knockout.js knockout-2.0


【解决方案1】:

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

var currentValue = test();

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

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

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

如果要比较对象是否包含相等的键和值,则需要某种“深度比较”方法。 (How to determine equality for two JavaScript objects?)

我不确定您所说的“添加条目”是什么意思。要设置新对象,请使用:

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 }

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 2017-04-16
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多