2014-01-11 106 views
1

我想對於淘汰賽專家來說,這對我來說會是一個簡單的問題,它令人困惑。淘汰賽並非所有的屬性都被映射

我的JSON輸入:

{ 
     "odata.metadata":"http://localhost:49163/odata/$metadata#TwitterMessages","value":[ 
     { 
      "message":{ 
      "text":"Pellentesque fermentum a diam a suscipit. Donec ultrices tempor sapien, vitae dictum erat pulvinar sagittis. Vivamus a fermentum lectus, et lacinia enim. Morbi pretium adipiscing risus, vitae euismod lacus fermentum eu.","company_fk":3,"image_url":"http://www.baconwrappedmedia.com/wp-content/uploads/2013/01/funny-kids-bacon-wrapped-media-21.jpg","active":true,"author_id":"3242342423","message_id":3,"author_picture":"http://3.bp.blogspot.com/_Gxh8CVH8l8Y/TJBDI4QVfnI/AAAAAAAAAWE/W1H4Z2MAub0/s1600/547206_1271901770610.27res_400_483.jpg","author_name":"Ligula","source":"TWITTER","createddatefriendly":"1 day ago","message":"Ut at erat at mauris euismod tincidunt non id justo?","pubdate":"2014-01-10T13:27:42.917" 
      },"hashtag":{ 
      "hashtag_id":2,"hashtag":"#voetbal","company_fk":3 
      },"twitter_id":"0","user_screenname":"Ligula","user_name":"Ligula","message_fk":3,"hashtag_fk":2 
     },{ 
      "message":{ 
      "text":"Duis sed nunc semper, volutpat urna et, volutpat diam.","company_fk":3,"image_url":"http://www.allfunnystuff.com/wp-content/uploads/2013/04/funny-baby-angry-punch.jpg","active":true,"author_id":"75675675","message_id":4,"author_picture":"http://www.drodd.com/images8/funny-face15.jpeg","author_name":"Curabitur","source":"TWITTER","createddatefriendly":"3 day(s) ago","message":"Suspendisse a sapien id lorem tincidunt imperdiet eget id velit.","pubdate":"2014-01-10T13:30:26.657" 
      },"hashtag":{ 
      "hashtag_id":2,"hashtag":"#voetbal","company_fk":3 
      },"twitter_id":"0","user_screenname":"Curabitur","user_name":"Curabitur","message_fk":4,"hashtag_fk":2 
     } 
     ] 
    } 

我的JavaScript /淘汰賽代碼:

function CompanyViewModel() { 
     var self = this; 
     self.name = ko.observable(); 
    } 

    function TweetViewModel(item) { 
     var self = this; 
     self.user_screenname = ko.observable(""); 
     self.user_name = ko.observable(""); 
     self.message = ko.observable(""); 
     self.hashtag = ko.observable(""); 
     ko.mapping.fromJS(item, {}, self); 
    } 

    function ViewModel() { 
     var self = this; 
     self.Company = ko.observable(new CompanyViewModel()); 
     self.Tweets = ko.observableArray([new TweetViewModel()]); 

     $.getJSON('/Data/company.json', function (data) { 
      ko.mapping.fromJS(data, {}, self.Company()); 
     }); 

     $.getJSON('/Data/tweets.json', function (allData) { 
      var mappedTweets = $.map(allData.value, function (item) { 
       return new TweetViewModel(item) 
      }); 
      self.Tweets(mappedTweets); 

      console.log(self.Tweets()) 
     }); 
    } 

    var vm = new ViewModel(); 

    ko.applyBindings(vm); 

我的HTML:

<tbody data-bind="foreach: Tweets"> 
     <tr> 
      <td data-bind="text: user_screenname"></td> 
      <td data-bind="text: message().text"></td> 
      <td data-bind="text: hashtag().hashtag"></td> 
     </tr> 
    </tbody> 

一切工作正常。但這裏是我的問題:

爲什麼我不需要「聲明」Message.Text observable使用它進行數據綁定,但我需要聲明user_screenname可見?

如果我想刪除行:

 self.user_screenname = ko.observable(""); 

我得到一個錯誤:user_screenname沒有定義。當我使用映射結構時,我期望user_screenname屬性也自動映射到視圖模型。或者我做錯了什麼?

回答

0

您需要明確聲明user_screenname,因爲您的message之一在返回的數據中不包含user_screenname屬性,因此映射不會創建它並且您的綁定將會中斷。在這種情況下,綁定,如果你沒有一個user_screenname屬性,因此它會沒有明確聲明user_screenname工作不會打破

<td data-bind="text: $data.user_screenname"></td>` 

您可以$data前綴你的財產。

+0

非常感謝您的回答!現在我明白了爲什麼! –

+0

最後,我通過使用tweets_initialized屬性來修復它。如果他們初始化,然後我給他們看。 –