Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Knockout api zoek form

Pagina: 1
Acties:
  • 308 views

Verwijderd

Topicstarter
Ik wil een simpel formulier maken waarin er gezocht kan worden door middel van een API.


<input type="text" class="search-query" placeholder="Search" id="global-search" data-bind="value: query, valueUpdate: 'keyup'"/>

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
var viewModel = {
    
       query : ko.observable(),
       employees : ko.observableArray(),
    
     };


    function EmployeesViewModel(query) {
          
          var self = this;
          self.query = ko.observable();
          self.employees = ko.observableArray();
          
        
         
          self.apiurl = ko.computed(function() {
        
                
                if(self.query()){
                  
                  return self.baseUri = BASE + "/api/v1/employees?q=" + self.query();
                
                }else{

                  return self.baseUri = BASE + "/api/v1/employees?limit=100&offset=0";


                }
                
                
                }, self);
                
         
         $.getJSON(self.apiurl(), self.employees);
 
        };
      
                

      ko.applyBindings(new EmployeesViewModel(viewModel.query()));


Het lukt me niet om de query variable te vullen deze blijft leeg. Wat zie ik over het hoofd?

  • Xpoint
  • Registratie: September 2008
  • Laatst online: 12-10 19:38
Je geeft onderin enkel een lege string mee, de initiële waarde van viewModel.query.
Verder (je hebt dit niet als probleem aan gegeven) roep je getJSON aan zonder callback. Moet dat niet dit zijn?

JavaScript:
1
2
3
4
$.getJSON(self.apiurl(), function(json) {
  // Verwijder alle employees en vervang met het resultaat.
  self.employees.splice.apply(self.employees, [0, self.employees.length].concat(json));
}); 


Ik denk dat je viewModel zelf weg kan laten, en enkel EmployeesViewModel blijft gebruiken. Sla de referentie van EmployeesViewModel (var viewModel = new EmployeesViewModel()) op, en gebruik de deze om je query aan te passen. (viewModel.query("zoek iets")).

Verder, als je de query aanpast, wordt de apiurl inderdaad ook aangepast. Maar daar doe je verder nog niets mee. Je zou moeten luisteren naar de apiurl wanneer deze veranderd, en opnieuw getJSON aan moeten roepen.

Edit: even snel wat uitgetypt wat in mijn ogen zou moeten werken. Niet getest, maar hopelijk kun je er wat mee. ;)

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function EmployeesViewModel(query) { 
    var self = this; 
    
    self.query = ko.observable(); 
    self.employees = ko.observableArray(); 

    self.apiurl = ko.computed(function() { 
        if(self.query()){ 
            return (self.baseUri = BASE) + "/api/v1/employees?q=" + self.query(); 
        }else{ 
            return (self.baseUri = BASE) + "/api/v1/employees?limit=100&offset=0"; 
        } 
    }).extend({ throttle: 500 }); // Wacht minimaal 500ms voordat we apiurl aanpassen.
    
    function refreshEmployees() {
        $.getJSON(self.apiurl(), function(json) {
            // Verwijder alle employees en vervang met het resultaat. 
            self.employees.splice.apply(self.employees, [0, self.employees.length].concat(json)); 
        }); 
    };
    
    // Vernieuw lijst van employees elke keer als de apiurl veranderd.
    self.apiurl.subscribe(refreshEmployees);
    
    refreshEmployees();
}; 

var viewModel = new EmployeesViewModel();
ko.applyBindings(viewModel);

[ Voor 42% gewijzigd door Xpoint op 19-03-2013 14:48 . Reden: Voorbeeld code ]


Verwijderd

Topicstarter
ik was zelf tot deze gekomen:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var employeesModel = function(){

        var self = this;

        self.u = base +'/api/v1/search';
        self.resource = 'employees';
        self.field = 'achternaam';
        self.employees = ko.observableArray([]);
        self.q = ko.observable();

        //Load Json when model is setup
        self.dummyCompute = ko.computed(function() {
            $.getJSON(self.u,{'resource': self.resource, 'field': self.field, 'q':self.q }, function(data) {
                    self.employees(data);
             });

        }, self);
    };

    ko.applyBindings(new employeesModel());
]
zonder een if else check

  • Xpoint
  • Registratie: September 2008
  • Laatst online: 12-10 19:38
Omdat op je input valueUpdate op keyUp staat zal dummyCompute erg vaak een request naar je server uitvoeren (elke keer als je een toets los laat). Beter plaats je dus nog .extend({ throttle: 500 }); zoals in mijn voorbeeld. Elke keer als een dependency van dummyCompute aangepast wordt, wacht hij dan minimaal 500ms voordat hij de request uitvoert, dus 500ms lang niets hebt ingetypt.

Verder is dummyCompute niet de beste manier om een callback af te handelen, maar het werkt. ;)

Verwijderd

Topicstarter
Inderdaad, goede tip en jouw code ziet er beter uit! tnx

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Goed, dan doe ik deze dicht. :) Voor een volgende keer: probeer als je een topic opent wat meer informatie te geven, zie De Quickstart. Met dit soort topics kunnen we negen van de tien keer niks omdat we maar wat moeten gissen. Bovendien is je topictitel niet erg goed als omschrijving voor je probleem. Als je daar volgende keer ook op wil letten zou dat fijn zijn. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.