2016-03-29 25 views
0

Arama filtresini web uygulamamda uygulamaya çalışıyorum. Bazı güzel makaleler okudum ve iyi Jsfiddles buldum.KnockoutJS ile arama filtresi

TypeName numarasını aramak ve satırı bu typename ile göstermek istiyorum. main.js:48 Uncaught TypeError: item.TypeName is not a function da ekrana error

Benim index.html:

<div class="form"> 
    <div class="form-group"> 
      <input type="search" class="form-control" data-bind="textInput: query" autocomplete="off" /> 
     </div> 
    </div> 

    <div id="tab1" class="col s12"> 
     <ul class="collapsible" data-collapsible="accordion" data-bind="foreach:brickInfos"> 
      <li data-bind="with: value"> 
       <div class="collapsible-header"> 
       <i class="material-icons">view_stream</i> 
       <p class="blue-text" data-bind="text: TypeName"></p> 
       </div> 
      </li> 
     </ul> 
    </div> 

Benim modelim:

function ViewModel() { 
    var self = this; 
    self.brickInfos = ko.observableArray([]); 

    db.query("BrickInfos/docs").then(function(result) { 
    var data = result; 
    console.log(data); 
    self.brickInfos(data.rows); 
    }); 

    self.query = ko.observable(""); 
    self.filteredBrickInfos = ko.computed(function() { 
     var filter = self.query().toLowerCase(); 

     if (!filter) { 
      return self.brickInfos(); 
     } else { 
      return ko.utils.arrayFilter(self.brickInfos(), function (item) { 
       return item.data.TypeName().toLowerCase().indexOf(filter) !== -1; 
      }); 
     } 
    }); 
} 

    var db = new PouchDB('http://localhost:5984/helloworld'); 
    var vm = new ViewModel(); 



    ko.applyBindings(vm); 

Bu edilir i arama yaparken benim modelinde bunu uygulamaya ama olsun ve hata Verilerim nasıl görünüyor: Json data on console

İyi bir öğüt, kodumu nasıl yapılandırmalıyım her zaman beklerim, çünkü KnockoutJS'de yeniyim. Sen alıyorsanız

{ 
    "BrickInfos": { 
         "BrickInfos": [ 
              { 
               "Properties": { 
                   "Properties": [ 

                       ] 
                  }, 
               "Implements": { 
                   "Interfaces": [ 
                        { 
                         "TypeName": "soemtypename" 
                        }, 
                        { 
                         "TypeName": "soemtypename2" 
                        } 
                       ] 
                  }, 
               "Name": "AccessBareBoneApp", 
               "Description": "", 
               "TypeName": "soemtypename", 
               "AssemblyName": "string other safasgfas", 
               "Obsolete": true 
              }, 
              { 
               "Properties": { 
                   "Properties": [ 
                        { 
                         "Name": "file", 
                         "Description": "asfasf", 
                         "ValidationType": 12, 
                         "Converter": 12, 
                         "EnumTypeName": "string1" 
                        } 
                       ] 
                  }, 
               "Implements": { 
                   "Interfaces": [ 
                        { 
                         "TypeName": "soemtypename" 
                        }, 
                        { 
                         "TypeName": "soemtypename" 
                        } 
                       ] 
                  }, 
               "Name": "File2", 
               "Description": "asfasfas", 
               "TypeName": "soemtypename", 
               "AssemblyName": "string other safasgfas", 
               "Obsolete": false 
              } 
              ] 
             } 
             } 
+0

i belki sağlanan bağlantıları görmek edemiyorum görebilirsiniz benim sonumdan güvenlik duvarı sorunu. Genel olarak hata bilgilerini genel olarak paylaşır ve json örneğini içerir. –

+0

Eklemek @supercool – Muli

+1

Buna benzer bir https://jsfiddle.net/LkqTU/29455/. typeName undefined alıyorsunuz çünkü gözlemlenebilir değil. –

cevap

1

item.TypeName tanımsız içeride sen gözlemlenebilir değildir () gösterimi ile typeName erişmek görünmektedir bilgisayarlı çünkü: Eğer

Burada JSON yayınlanmıştır ederiz. Genellikle, temel olarak içeriğini okuyan () kullanarak gözlemlenebilir bir kopyasını çıkarırız.

ViewModel: Ben birkaç şeyler değiştirdiniz

var self = this; 
    self.brickInfos = ko.observableArray([]); 
    self.brickInfos(json.BrickInfos); 

    self.query = ko.observable(""); 
    self.filteredData = ko.computed(function() { 
    var filter = self.query().toLowerCase(); 

    if (!filter) { 
     return ; 
    } else { 
     return ko.utils.arrayFilter(self.brickInfos(), function(item) { 
     return item.TypeName.toLowerCase().indexOf(filter) !== -1; 
     }); 
    } 
    }); 
} 
var vm = new ViewModel(); 
ko.applyBindings(vm); 

, sen çalışma örneği

var json = { 
 
    "BrickInfos": [{ 
 
    "Properties": { 
 
     "Properties": [ 
 

 
     ] 
 
    }, 
 
    "Implements": { 
 
     "Interfaces": [{ 
 
     "TypeName": "soemtypename" 
 
     }, { 
 
     "TypeName": "soemtypename2" 
 
     }] 
 
    }, 
 
    "Name": "AccessBareBoneApp", 
 
    "Description": "", 
 
    "TypeName": "soemtypename", 
 
    "AssemblyName": "string other safasgfas", 
 
    "Obsolete": true 
 
    }, { 
 
    "Properties": { 
 
     "Properties": [{ 
 
     "Name": "file", 
 
     "Description": "asfasf", 
 
     "ValidationType": 12, 
 
     "Converter": 12, 
 
     "EnumTypeName": "string1" 
 
     }] 
 
    }, 
 
    "Implements": { 
 
     "Interfaces": [{ 
 
     "TypeName": "soemtypename" 
 
     }, { 
 
     "TypeName": "soemtypename" 
 
     }] 
 
    }, 
 
    "Name": "File2", 
 
    "Description": "asfasfas", 
 
    "TypeName": "soemtypenameTest", 
 
    "AssemblyName": "string other safasgfas", 
 
    "Obsolete": false 
 
    }] 
 
} 
 

 
function ViewModel() { 
 
    var self = this; 
 
    self.brickInfos = ko.observableArray([]); 
 
    self.brickInfos(json.BrickInfos); 
 

 
    self.query = ko.observable(""); 
 
    self.filteredData = ko.computed(function() { 
 
    var filter = self.query().toLowerCase(); 
 

 
    if (!filter) { 
 
     return self.brickInfos(); 
 
    } else { 
 
     return ko.utils.arrayFilter(self.brickInfos(), function(item) { 
 
     return item.TypeName.toLowerCase().indexOf(filter) !== -1; 
 
     }); 
 
    } 
 
    }); 
 
} 
 
var vm = new ViewModel(); 
 
ko.applyBindings(vm);
body { 
 
    font-family: arial; 
 
    font-size: 14px; 
 
} 
 

 
.liveExample { 
 
    padding: 1em; 
 
    background-color: #EEEEDD; 
 
    border: 1px solid #CCC; 
 
    max-width: 655px; 
 
} 
 

 
.liveExample input { 
 
    font-family: Arial; 
 
} 
 

 
.liveExample b { 
 
    font-weight: bold; 
 
} 
 

 
.liveExample p { 
 
    margin-top: 0.9em; 
 
    margin-bottom: 0.9em; 
 
} 
 

 
.liveExample select[multiple] { 
 
    width: 100%; 
 
    height: 8em; 
 
} 
 

 
.liveExample h2 { 
 
    margin-top: 0.4em; 
 
    font-weight: bold; 
 
    font-size: 1.2em; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<div class="form"> 
 
    <div class="form-group"> 
 
    <input type="search" class="form-control" data-bind="textInput: query" autocomplete="off" /> 
 
    </div> 
 
</div> 
 

 
<div id="tab1" class="col s12"> 
 
    <ul class="collapsible" data-collapsible="accordion" data-bind="foreach:filteredData"> 
 
    <li> 
 
     <div class="collapsible-header"> 
 
     <i class="material-icons">view_stream</i> 
 
     <p class="blue-text" data-bind="text: TypeName"></p><br> 
 
     </div> 
 
    </li> 
 
    </ul> 
 
</div>

+0

Eğer filtre yoksa o zaman ben 'self.brickInfos()' dizisinin tamamını döndürürdüm. – Tomalak

+0

evet bunu özledim. nice catch cheers –

+0

Eğer '() 'TypeName' i kaldırırsam, 'undefined' toLowerCase 'özelliği okunamaz' – Muli