Javascript 检测“observableArray”是否尚未设置或在淘汰赛中是否真的为空的最佳方法是什么?
我想告诉您,Javascript 检测“observableArray”是否尚未设置或在淘汰赛中是否真的为空的最佳方法是什么?,javascript,arrays,knockout.js,Javascript,Arrays,Knockout.js,我想告诉您,observearray是否尚未设置,或者是否真的为空。例如,我定义了var arr=ko.observearray(),然后使用ko.mapping(data,mappingConfig,arr)将值注入arr。我想知道arr是否已映射 但是,var arr=ko.observableArray()将使arr()计算为[],而不是未定义的。(相反,var val=ko.observable()将使val()评估为未定义的)我不应该根据arr的长度来判断 我不应该使用var arr=
observearray
是否尚未设置,或者是否真的为空。例如,我定义了var arr=ko.observearray()
,然后使用ko.mapping(data,mappingConfig,arr)
将值注入arr
。我想知道arr
是否已映射
但是,var arr=ko.observableArray()
将使arr()
计算为[]
,而不是未定义的。(相反,var val=ko.observable()
将使val()
评估为未定义的)我不应该根据arr
的长度来判断
我不应该使用var arr=undefined
,因为这将使依赖arr
的其他计算可观测值在映射arr
后无法得到通知。在映射之前,您不能订阅arr
我不应该使用var arr=ko.observable()
,因为它总是可观察的
,而不是可观察的array
,即使您从数组映射它
因此,似乎我只能保留一个标志来指示是否设置了observableArray
,例如var arr=ko.observableArray();arr.isSet=ko.可观察(假)代码>
如果您试图以这种方式使用可观测阵列,则可能有点违背了粒度
话虽如此,保持一个单独的旗帜是可行的。为了稍微整理一下,如果您想很好地包含该标志,您还可以创建“子可观察对象”。差不多
var arr = ko.observableArray();
arr.initialised = ko.observable();
然后,您可以观察arr.initialized
,就像任何其他可观察对象一样,传递arr
也会传递其标志
或者,为什么不使用ko.observable()
?您仍然可以在其中使用数组。像.push()
这样的便捷方法不会为您带来任何好处,但这可能并不重要。如果在将数组放入可观察对象后确实需要对其进行变异,则需要这样做
var arr = ko.observable();
...
arr( [1, 2, 3] );
...
var underlyingArray = arr();
underlyingArray.push(4);
arr.valueHasMutated();
有时,如果您更多地遵循一种功能性风格,即无论如何都有一个新的数组,或者如果您有很多元素要推送,那么这可能会更有效,因为observable只会通知订阅者一次,而不是每次。push()
调用您可以将未定义的元素分配给observable数组。因此,您的初始化将如下所示:
var arr = ko.observableArray();
arr(undefined);
您甚至可以创建自己的包装器来实现这一点:
ko.undefinedObservableArray = function () {
var arr = ko.observableArray();
arr(undefined);
return arr;
};
你所说的“有点违背规则”是什么意思?为什么以我的方式使用observearray
是不合适的?你的第二个代码块很酷。observearray.push
在幕后这么简单吗?我刚刚意识到我可以手动绑定。将
推到可观察的
,我知道它将映射为一个可观察的数组
。我更喜欢使用可观察的
,因为代码会更加一致。但是我必须将observable array
的函数附加到observable
上。