2017-06-09 3 views
0

Ich habe den folgenden Code in einer App mit Knockout.js, aber etwas bekam meine Aufmerksamkeit mit der folgenden Funktion:seltsame Verhalten in Knockout.js Rechenfunktion

this.filterLocations = ko.computed(function() { 
        return ko.utils.arrayFilter(self.locations(), function (loc) { 
         if(self.textFilter() != undefined){ 
          self.hideMarkers(); 
          return loc.title.toLowerCase().includes(self.textFilter().toLowerCase()); 
         }else{ 
          return true; 
         } 

        }); 
       }, this); 

Ich mag die self.hideMarkers() in der anrufen aber sonst Anweisung, wenn ich es in der else-Anweisung ich folgende Fehlermeldung bekam:

Uncaught TypeError: self.hideMarkers is not a function

ich kann nicht herausfinden, warum dies geschieht, weil der gleiche Anruf in dem if-Anweisung hat keine Fehler und Arbeit fein.

Der Funktionscode ist:

this.hideMarkers = function() { 
     for (var i = 0; i < self.markers.length; i++) { 
      var isIn = true; 
      for (var y = 0; y < self.filterLocations().length; y++) { 
       var el = self.filterLocations()[y]; 
       if(el.id !== i + 1){ 
        isIn = false; 
       }else{ 
        isIn = true; 
        break; 
       } 
      } 
      if(isIn){ 
       self.markers[i].setMap(map); 
      }else{ 
       self.markers[i].setMap(null); 
      } 
     } 
    }; 

Jede Idee dazu?

+0

Nicht sicher, was das eigentliche Problem ist, aber es sieht für mich aus wie Sie alle Arten von Dingen tun * innerhalb * Ihrer Filtermethode, die außerhalb passieren sollte ... – user3297291

+0

Ja, weil in diesem Fall habe ich eine Liste von Elemente gezeigt und auch eine Liste von Markern, so dass die Filterfunktion einen booleschen Wert zurückgeben muss, um die Liste zu filtern, aber auch die Methode aufrufen, um die Marker in der Map zu filtern –

Antwort

0

löste ich das Problem Aufruf direkt:

self.filterLocations = ko.computed(function() { 
        return ko.utils.arrayFilter(self.locations(), function (loc) { 
         if(self.textFilter() == undefined || self.textFilter() == ""){ 
          for (var i = 0; i < self.markers.length; i++) { 
           self.markers[i].setMap(map); 
          } 
          return true; 
         } 
         self.hideMarkers(); 
         return loc.title.toLowerCase().includes(self.textFilter().toLowerCase()); 
        }); 
       }, this); 

Aber dieses noch ein seltsames Verhalten.