2014-10-31 27 views
1

獲取我正在學習Marionette柔和介紹,面臨Single Contact API部分的一些問題。Marionette屬性未定義,請從API

好吧,讓我們直接點。

這是我的模板

 <script type="text/template" id="contact-view"> 
      <%= id %> 
      <h1><%= firstName %> <%= lastName %></h1> 
      <p><strong>Phone number:</strong> <%= phoneNumber %></p> 
     </script> 

這是我的控制器的一部分

showContact: function(id){ 
     var contact = ContactManager.request('contact:model', id); 
     var contactView; 
     if(contact !== undefined) 
     { 
      contactView = new Show.Contact({ 
       model: contact 
      }); 
     } 
     else 
     { 
      contactView = new Show.MissingContact(); 
     } 

     ContactManager.mainRegion.show(contactView); 
    } 

這是我的模型

Entities.Contact = Backbone.Model.extend({ 
    urlRoot: "php/contacts/index.php", 
    defaults: { 
     firstName: '', 
     lastName: '', 
     phoneNumber: '' 
    } 
}); 

var API = { 
    getContactEntity: function(contactId){ 
     var contact = new Entities.Contact({id:contactId}); 
     contact.fetch(); 

     return contact; 
    } 
}; 

ContactManager.reqres.setHandler("contact:model", function(id){ 
    return API.getContactEntity(id); 
}); 

的一部分,這是我的PHP API

$data[] = array('id'=>1, 'firstName'=>'Alice', 'lastName'=>'Arten', 'phoneNumber'=>'555-0184'); 
$data[] = array('id'=>2, 'firstName'=>'Bob', 'lastName'=>'Brigham', 'phoneNumber'=>'555-0184'); 
$data[] = array('id'=>3, 'firstName'=>'Charlie', 'lastName'=>'Campbell', 'phoneNumber'=>'555-0184'); 
echo json_encode($data[1]); 

我試圖保持簡單。因此,錯誤的是下面當我刪除默認

firstName is not defined 

,我試圖控制檯登錄模型中的聯繫人,請參閱本http://prntscr.com/51k7ec

我敢肯定,這是獲得屬性從previousAttributes而不是屬性

請幫我一把。我做錯了什麼嗎?

預先感謝

+0

請問您可以附上'reqres.setHandler(「contact:model」...)' – Evgeniy 2014-10-31 13:35:05

+0

已經附加在模型部分的代碼。謝謝 – 2014-10-31 16:17:16

+0

我明白,fetch是異步的,你一定要等到它完成 – Evgeniy 2014-10-31 19:11:30

回答

0

fetchBackbone.Model返回​​對象的方法。 fetch方法默認爲異步,因此您需要將回調附加到從它返回的promise,然後在該回調中您將有權訪問實際獲取的模型。

我會建議你閱讀更多關於Deferred object的對象,以便更深入地理解它。

對於您的問題,我會建議你答應對象附加到模型:

var API = { 
    getContactEntity: function(contactId){ 
     var contact = new Entities.Contact({id:contactId}); 
     contact.promise = contact.fetch(); 
     return contact; 
    } 
}; 

然後在你的控制器文件包與DONE回調渲染部分:

showContact: function(id){ 
    var contact = ContactManager.request('contact:model', id); 
    var contactView; 
    contact.promise.done(function(){ 
    if(contact !== undefined) 
    { 
     contactView = new Show.Contact({ 
      model: contact 
     }); 
    } 
    else 
    { 
     contactView = new Show.MissingContact(); 
    } 

    ContactManager.mainRegion.show(contactView); 

    }); 
} 

在這種情況下,一些你的代碼的一部分將工作。爲什麼有一部分?原因else塊永遠不會執行。 您的if聲明不正確。您的模型不能爲undefined。它可能引發錯誤並停止執行您的代碼,但它不能是undefined。如果發生錯誤,您可以將fail回調附加到您的承諾並處理該情況。

如果你想要展示接觸,並確保在id後端存在只是刪除if語句,然後添加fail回調與else情況下,一定要在後端API的變化,當ID不存在與404 Not found迴應。