如果我的搜索输入中的属性匹配,我想返回true。我设法用我的JSON数据中的其他属性来做到这一点,但在我的嵌套数据中,我做不到。尝试使用for
循环,也只使用if
,但没有成功。
这就是我从DB获取json的方式:
db.query("One/docs").then(function(dataone){
var oness = [];
for(var i=0; i < dataone.rows.length; ++i) {
var x = new one();
x.fromJS(dataone.rows[i].value);
oness.push(x);
}
self.OneInfos(oness);
})
也许我忘了什么,我真的不知道:P。
代码1:
function one(){
var self = this;
self.AssemblyName = ko.observable();
self.Description = ko.observable();
self.Name = ko.observable();
self.Obsolete = ko.observable();
self.TypeName = ko.observable();
self.Properties = ko.observable();
self.Implements = ko.observable();
self.Implements.Interfaces = ko.observable();
self.IsInSearch = ko.pureComputed(function(){
var searchRegEx= App.instance.SearchRegEx();
if(!searchRegEx)
return true;
if(searchRegEx.test(self.TypeName())) {
return true;
}
if(searchRegEx.test(self.Name())) {
return true;
}
if(searchRegEx.test(self.Description())) {
return true;
}
//todo - look if there is a filter for interfaces
if (searchRegEx.test(self.Implements.Interfaces.TypeName())){
return true;
}
return false;
});
}
这是我的第二个解决方案for
循环(它位于“todo - comment”下的同一行):
for(var i=0; i < Implements.length;++i) {
var Implement = Implements[i];
if (searchRegEx.test(self.Interfaces.TypeName)){
return true;
}
}
注意:我的工具会显示一个选择输入
答案 0 :(得分:0)
我不确定为什么您的数据映射有效,因为fromJS
似乎不在您的one
视图模型中。然而, 在ko.mapping
中,所以我只是假设你以某种方式正确地访问它。
var x = new one();
x.fromJS(dataone.rows[i].value);
根据knockout documentation,ko.mapping.fromJS
的工作原理如下:
对象的所有属性都将转换为可观察对象。如果更新将更改该值,则它将更新observable。
这意味着Implements
是一个可观察的。 <{1}}将被定义为未定义,但Implements.Interfaces
将返回您的数组。
要搜索此数组的Implements().Interfaces
值,您必须使用:
TypeName
编辑:请注意,我在评论后的对话中做了一些修改。似乎这个问题不仅仅是访问一个observable中的数据,而是关于检查undefined以及...
答案 1 :(得分:0)
您不需要if (self.Implements() && self.Implements().Interfaces)
。
var interfaces = self.Implements();
for(var i=0; i < interfaces.length;++i) {
var currentInterface = interfaces[i];
if (searchRegEx.test(currentInterface.TypeName)){
return true;
}
}
修改了上面答案中的代码。
我认为这可以搜索您的Implements和属性TypeName。 希望这有帮助