搜索属性是否匹配不起作用

时间:2016-04-04 09:04:58

标签: javascript node.js knockout.js

如果我的搜索输入中的属性匹配,我想返回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。

我的Json数据: Json img

代码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;
      }   
    }

注意:我的工具会显示一个选择输入

2 个答案:

答案 0 :(得分:0)

我不确定为什么您的数据映射有效,因为fromJS似乎不在您的one视图模型中。然而, ko.mapping中,所以我只是假设你以某种方式正确地访问它。

var x = new one();
x.fromJS(dataone.rows[i].value);

根据knockout documentationko.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。 希望这有帮助