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
上。