2012-10-22 7 views
14

Lavorando a un nuovo progetto utilizzando Knockout, la documentazione di base non sembra spiegare un caso come di seguito. Usando il sotto attr chiamare; Un href corretto è prodotto: "api/gradi/funzione c() {if (0"Knockout.js att errore quando si combina letterale stringa e valore oggetto

<a data-bind="attr: { href: '/api/degrees/' + fieldId }"> 

Sebbene quanto segue produce il valore fieldID correttamente

<a data-bind="attr: { href: fieldId }"> 

è l'unico modo per combinare con successo la stringa di base URL e valore dell'oggetto JS utilizzare un valore calcolato Knockout?

Grazie in anticipo per l'aiuto.

risposta

18

Prova:

<a data-bind="attr: { href: '/api/degrees/' + fieldId() }"> 
+0

Impressionante, bella risposta rapida e funziona! Perché le parentesi chiamate dovrebbero essere richieste quando si aggiunge una stringa e non quando si utilizza da sola? – Mebourne

+3

Non ho abbastanza sfondo in KO e javascript per spiegarlo abbastanza, ma credo che abbia a che fare con il modo in cui KO analizza ed esegue la tua espressione in javascript. Nel tuo primo caso, stai facendo concatenazione di stringhe, quindi javascript chiama implicitamente "toString" su fieldId, che è una funzione, che restituisce il contenuto della funzione. Nel tuo secondo esempio, credo che knockout tenterà di richiamare fieldId come funzione, inorder per ottenere il valore, prima del binding. Suppongo che fieldId sia di tipo ko.osservabile. – Alan

+5

@ user1742487: Per rispondere alla tua domanda, tutte le osservabili sono funzioni. Normalmente dovresti "chiamarlo" per ottenere il suo valore. Tuttavia all'interno di una rilegatura, l'eliminazione diretta può leggere direttamente un osservabile, quindi non è necessario chiamarlo quando è tutto da solo. Ma nel momento in cui hai un'espressione più complessa (come la concatenazione di stringhe lì), devi chiamarla in modo da concatenare il valore memorizzato nell'osservabile, non nell'osservabile stesso. –

Problemi correlati