2016-04-04 2 views
0

Я хочу вернуть true, если моя собственность соответствует совпадению в моем входе для поиска. Мне удалось сделать это с помощью моих других свойств из моих данных JSON, но в моих вложенных данных я не могу. Пробовал его с помощью for цикла, а также просто с if, но безуспешно.Поиск, если свойство соответствует, не работает

это, как я получаю мой 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 - комментарий"):

for(var i=0; i < Implements.length;++i) { 
     var Implement = Implements[i]; 
     if (searchRegEx.test(self.Interfaces.TypeName)){ 
      return true; 
     } 
    } 

Примечание: Мои орудия отображаются с выбранным входом

+0

Как вы конвертируете свой JSON в свою модель просмотра 'one'? То, как вы используете как наблюдаемые «Реализуемые инструменты», так и наблюдаемые «Реализованные инструменты», немного странно. Как насчет 'for (var i = 0; i <Реализует(). Length; i + = 1)' и т. Д.? – user3297291

ответ

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

Изменен код из вашего ответа выше.

Я думаю, что это работает по мере того, как он выполняет поиск через свои объекты и свойства TypeName. Надеюсь, что это поможет

+0

Ok thnx @FBC, отлично работает – Muli

0

Я не уверен, почему работает сопоставление данных, так как fromJS, похоже, не в вашей модели one. Это в ko.mapping однако, я просто предполагаю, что вы каким-то образом обращались к нему правильно.

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

Согласно knockout documentation, ko.mapping.fromJS работ, как так:

Все свойства объекта преобразуются в наблюдаемой. Если обновление изменит значение, оно обновит наблюдаемое.

Это значит, что Implements является наблюдаемым. Implements.Interfaces будет не определено, но Implements().Interfaces вернет ваш массив.

Для поиска TypeName значения этого массива, вы должны будете использовать:

if (self.Implements() && self.Implements().Interfaces) { 
    var interfaces = self.Implements().Interfaces; 

    for(var i=0; i < interfaces.length;++i) { 
    var currentInterface = interfaces[i]; 
    if (searchRegEx.test(currentInterface.TypeName)){ 
     return true; 
    } 
    } 
} 

правки: Обратите внимание, что я сделал некоторые изменения после нашего разговора в комментариях. Кажется, что этот вопрос касался не только доступа к данным внутри наблюдаемого, но и для проверки неопределенных ...

+0

Чтобы убедиться, что ваши вычисления не вызывают ошибки, когда они выполняются до того, как будут какие-либо данные, вы можете обернуть цикл внутри блока 'if (self.Implements()) {}'. – user3297291

+0

Я получаю undefined в строке: 'var interfaces = self.Implements(). Интерфейсы;' – Muli

+0

Я обновил ответ, чтобы показать дополнительную проверку. Он по-прежнему предполагает, что структура данных для всех ваших объектов равна. I.e .: есть __always__ объект 'Implements ', который __always__ имеет массив' Interfaces'. Если ваша структура данных нерегулярна, вам придется выполнить еще несколько неопределенных проверок. – user3297291

Смежные вопросы