我想知道是否有一种方法可以在尝试将数据放入可观察数据之前检查数据是否为null
?
现在我这样做:
if (!data.Filename) {
this.FileName = ko.observable("");
}
else {
this.FileName = ko.observable(data.Filename);
}
否则数据中的空值将导致整个属性不显示。有没有办法使用扩展器或我可以添加空检查的东西,而不必对每个属性执行此操作?我的数据在我无法控制的随机位置中具有空值,并且我不希望该属性不显示,因为数据集中的一行具有该属性的空值。
似乎应该有更好的方法来做到这一点。
答案 0 :(得分:3)
HEH
有很多方法可以做到这一点。我会做的是
var self = this;
self.fileName = ko.observable(data.Filename);
self.fileNameComputed = ko.computed(function(){
return self.fileName() || ""
});
然后,在你的标记引用中,如果是可观察的,则计算出来。
答案 1 :(得分:1)
在Javascript中还有其他可用的模式。
第一个,最简单,类似于C#中的function findElement(selector: any)
{
if (angular.isDefined(this.$window.jQuery)) {
return this.$document.find(selector);
} else {
return angular.element(this.$document.querySelector(selector));
}
}
var cdnBasePath: any = findElement('meta[name="cdnBasePath"]').attr('content');
运算符:
ko.utils.arrayFilter(self.Items(), function(item) { return item.isSelected; });
??
运算符将返回左操作数,除非它是falsy,然后它将回退到第二个参数。我上面的例子将是:
function ViewModel(data) {
data = data || {};
this.Filename .observable(data.Filename || "");
}
本身“至少”是一个空对象(其中||
未定义); data
的输入“至少”为空字符串。第二个选项是使用默认选项。利用jQuery合并输入数据和默认选项的示例:
.Filename
这会将ko.observable(...)
“折叠”到var defaultData = {
Filename: "enter-a-file" // could also be empty string of course!
};
function ViewModel(data) {
var dto = $.extend({}, defaultData, data);
this.Filename = ko.observable(dto.Filename);
}
,并将该结果折叠成一个空的新对象,确保data
变量保存合并后的结果。然后,您的其余功能可以安全地假设一个完全填充的输入变量。
我要提到的第三和最后一个选项是QBM5's answer的混音,但我同意那里的评论者if you can use a pureComputed
(在你的例子中,是完全没问题,你可能应该:
defaultData
PS。您没有提到您提到的潜在问题,因为您分别在dto
和function ViewModel(data) {
var self = this;
data = data || {};
this.Filename = ko.observable(data.Filename);
this.FilenameText = ko.pureComputed(function() {
return self.Filename() || "";
});
}
拼写了FileName
和Filename
不同的大小写,不是吗? ; - )