2013-04-18 11 views
8

È possibile in alcun modo eseguire quanto segue senza dover passare per osservabili temporanei/osservabili calcolati? Ho dati comune che viene utilizzato per le ricerche per visualizzare i dati:KO "text-binding" text: "a una funzione con un parametro

<span data-bind="text: lookupContactName(31)"></span> 

risultato: la funzione è exectuded, il parametro viene trovato, la logica ok, e il nome completo calcolato viene restituito, ma non visualizzata (probabilmente dal momento che non osservabile)

<span data-bind="text: lookupContactName(contactId)"></span> 

risultato: contactID non viene analizzato in modo corretto il valore del parametro non è visibile.

Suppongo che funzioni correttamente e che sia necessario creare associazioni personalizzate?

in generale: ho iniziato a dubitare un po 'se il mio approccio per caricare i dati solo una volta e provare a far corrispondere gli id ​​è un buon approccio. qualche punto di vista? sto meglio di creare tabelle/viste db/SP unite?

Grazie, J.

qui, sono i pezzi di codice rilevanti sto usando ... imparerò jsfiddle aiuto futuro.

ALL di ALERT stanno tornando i valori attesi ... ma ancora il testo di associazione dati non riceve il valore

Una libreria di dati comune:

customers.Contact = function() { 
    var self = this; 

    id = ko.observable(); 
    title = ko.observable(); 
    givenname = ko.observable(); 
    surname = ko.observable(); 
    fullName = ko.computed(function() { 
     return title()+". "+givenname()+" "+surname(); 
    }); 

    return { 
     id: id, 
     title: title, 
     givenname: givenname, 
     surname: surname, 
     fullName: fullName 
    }; 
}; 
customers.ContactList = function() { 

    var self = this; 

    contactList = ko.observableArray([]); //.publishOn("ContactList"); 

    loadContactData = function() { 
     var self = this; 

     customers.helperDataService.getContactData(loadContactDataCallBack); 
    }; 

    loadContactDataCallBack = function (json) { 
     var self = this; 

     $.each(json, function (i, p) { 

      var contact = new customers.Contact().id(p.Id) 
                .title(p.Title) 
                .givenname(p.Name) 
                .surname(p.Surname); 

      contactList.push(contact); 
     }); 

    }; 

    lookupContactName = function (id) { 
     var self = this; 

     alert("value to be found: "+id); 

     ko.utils.arrayForEach(contactList(), function (contact) { 
      alert("SEARCH: contactid: " + contact.id() + " - " + "id: " + id); 
      if (contact.id() === id) { 
       alert("FOUND: contactid: " + contact.id() + " - " + "id: " + id); 
       alert("value:" + contact.fullName()); 
       return contact.fullName(); 
      } 
     }); 
    }; 

    return { 
     loadContactData: loadContactData, 
     lookupContactName: lookupContactName 
    }; 
}; 

che viene chiamato da qui .. . (ho cambiato in contactID() e questo passa il valore corretto alla funzione)

<div>Creator: <span data-bind="text: lookupContactName(contactId())"></span></div> 
+0

Sono solo curioso ... che cosa significa 'lookupContactName' pensa il suo parametro è se si utilizza' lookupContactName (contactID) '? Ha appena ottenuto la stringa "contactId"? – bdesham

+0

In generale questo dovrebbe funzionare. Puoi forse mettere insieme un JSFiddle che mostri il tuo problema? – nemesv

+0

Changed lookupContactName (contactId) in lookupContactName (contactId()) questo fornisce l'id corretto invece di non restituire nulla. grazie per il testa a testa – jcuypers

risposta

0

io non sono così sicuro di capire qual è il tuo problema qui. Si può fare una cosa del genere, se si desidera:

function lookupContactName(cid) { 
    var obj = ... // Find your object by id; 
    return ko.computed(function() { 
     return obj.name() + obj.lastname(); 
    }); 
} 

dovrebbe funzionare.

+0

scusa ragazzi, devo studiare un po 'jsfiddle, non l'ho mai usato ... ho fatto un po' di progressi, ma ancora senza fortuna.Copio incollerò il codice pertinente, spero che tu capisca meglio. – jcuypers

+0

hey ragazzi ho trovato una soluzione (bypass). non capisco perché, ma per qualche motivo il ritorno funziona solo al di fuori del ciclo di array ... – jcuypers

3

Se il tuo <span data-bind="text: lookupContactName(contactId())"></span> si trova in un ciclo foreach, è necessario anteporre il metodo a $ root, altrimenti cercherà "lookupContactName" all'interno dell'array che sta eseguendo il ciclo.

Prova:

<div>Creator: <span data-bind="text: $root.lookupContactName(contactId())"></span></div> 
1

Il problema è che si ricerca la funzione non restituisce un valore

ko.utils.arrayForEach(contactList(), function (contact) { 
// some checking code 
    return contact.fullName(); 
}); 

tuo "ritorno" è legato alla funzione interna passato al arrayForEach metodo di utilità. Avete bisogno di un codice come questo

var result; 
ko.utils.arrayForEach(contactList(), function (contact) { 
// some checking code 
    result = contact.fullName(); 
}); 
return result; 
Problemi correlati