2012-02-14 13 views
29

Ho un semplice foreach:knockout proprietà viewmodel indefinito

<div id="customersArea" data-bind="foreach: people"> 
      <div class="section" data-bind="attr: { 'personid': PersonId }" > 
       <div class="sectionActions"> 
        <div><a class="action" href="#" data-bind='click: $parent.removePerson'>Remove</a></div> 
       </div> 
       <div class="sectionText"> 
        <span data-bind="if:LastName, text:LastName"></span> 
        <span data-bind="if:FirstName, text:FirstName"></span> 
        <span data-bind="if:MailingAddress"> 
         <span data-bind="with:MailingAddress"> 
          <span data-bind="text:StreetPartOne"> </span> 
          <span data-bind="text:StreetPartTwo"> </span> 
          <span data-bind="text:City"></span> 
          <span data-bind="text:PostalCode"></span> 
         </span> 
        </span> 

        <span data-bind="if:EmailAddress, text:EmailAddress"></span> 
        <span data-bind="if:MainPhoneNumber, text:MainPhoneNumber"></span> 
        <span data-bind="if:MobilePhoneNumber, text:MobilePhoneNumber"></span> 

       </div> 

       <div class="sectionOptions"> 

       </div> 
      </div> 
     </div> 

Sto cercando di renderlo tale che io possa legare contro un modello {PersonId: 33} e il resto sarà solo non rende se mancante. quando provo in questo e in altri modi ottengo

Uncaught Error: Unable to parse bindings. 
Message: ReferenceError: MailingAddress is not defined; 
Bindings value: if:MailingAddress 

ho creato un semplice jsfiddle alla prova:

http://jsfiddle.net/E7kUr/

risposta

69

Quindi, ci sono alcune opzioni che si hanno:

  1. KO avrà un problema quando si tenta di associarsi a proprietà non definite, a meno che non siano fuori da un oggetto. Quindi, puoi anteporre i vari binding con $data. e KO sarà in grado di analizzare i tuoi binding. Esempio: http://jsfiddle.net/rniemeyer/dLCL8/ Se si sa che diverse proprietà saranno sempre insieme, è possibile utilizzare un'istruzione o if attorno a tali opzioni.

  2. Un approccio diverso per la gestione delle proprietà "non definite" consiste nel creare un legame che inserisce queste proprietà quando sono mancanti. Guarda la risposta this. Sarebbe simile, ma potenzialmente con l'associazione "testo". Esempio: http://jsfiddle.net/rniemeyer/dLCL8/4/

+0

ho provato testo con init con {PersonId: 33, Cognome: "Frank"} e doesn 't mostrare il cognome ... – maxfridbe

+0

Ho aggiornato la rilegatura. Devi essere leggermente diverso per il binding 'text': http://jsfiddle.net/rniemeyer/dLCL8/4/ –

+0

@RPNiemeyer Grazie per il suggerimento, come possiamo farlo con" attr "binding? –

Problemi correlati