2016-04-22 147 views
1

下面是這種情況:訪問屬性

我現在有一個對象,如下所示:

enter image description here

運行modal.PersonInfo後,我得到返回的對象開始第3行。見上圖。

問題:在我的HTML,我怎麼能叫FirstNameLastName

錯誤狀態:

Uncaught ReferenceError: Unable to process binding "text: function(){return PersonInfo().FirstName}" Message PersonInfo is not defined

的JavaScript:

function Person() { 
    var modal = this; 
    modal.PersonInfo = ko.observable(''); 

    modal.setData = function (id) { 
     $.ajax({ 
      type: "GET", 
      url: '/Person/UserInformation?id=' + id, 
      contentType: "application/json; charset=utf-8", 
      success: function (data) { 
       modal.setPersonInfo(data); 

       $('#person-modal').modal('show'); 
      } 
     }); 

     modal.setPersonInfo = function (data) { 
      modal.PersonInfo = data; 
     } 
    } 
}; 

HTML 我的想法是,我可以做到以下幾點:

<p data-bind="text: PersonInfo().FirstName"></p> 
<p data-bind="text: PersonInfo().LastName"></p> 
+0

你在調用'applyBindings'是什麼?此外,'setPersonInfo'將用一個普通的javascript對象代替你的'observable'。你需要使用'ko.mapping.fromJS()'來保持它的可觀察性。 –

回答

2

此行取代可觀察到的,而不是分配值:

modal.PersonInfo = data; 

試試這個:

modal.PersonInfo(data) 

還有就是放錯地方的閉幕BR ace:model.setPersonInfo was insidemodel.setData

請參閱working demo

+0

上看到使用映射的優勢,感謝您的幫助。但是,我的HTML仍然失敗......它說PersonInfo不存在。有任何想法嗎? – ChaseHardin

+0

你能顯示'data'的輸出嗎? – Neps

+0

當然,在調試和輸入'data'時,我得到這個:'Object {名字:「Frankie」,姓氏:「Jones」,年齡:55}' – ChaseHardin

1

你會需要直接使用某種映射,比如ko.mapping。確保你綁定你的視圖模型,以某種方式啓動你的功能,你應該沒問題。

var DemoPage = (function() { 
 
    function DemoPage() { 
 
    \t var _this = this; 
 
     _this.PersonInfo = ko.observable({}); 
 
     _this.setData = function (id) { 
 
      // some ajax that returns data 
 
      var _data = { 
 
      \t FirstName: 'Frankie', 
 
       LastName: 'Jones' 
 
      }; 
 
      _this.setPersonInfo(_data); 
 
      //$('#person-modal').modal('show'); 
 
    \t }; 
 
     \t _this.setPersonInfo = function (data) { 
 
      ko.mapping.fromJS(data, {}, _this.PersonInfo()); 
 
     \t }; 
 
     
 
    \t this.setData(); 
 
    } 
 
    return DemoPage; 
 
})(); 
 

 
var demoApp = new DemoPage(); 
 

 
ko.applyBindings(demoApp);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.js"></script> 
 

 
<p data-bind="text: PersonInfo().FirstName"></p> 
 
<p data-bind="text: PersonInfo().LastName"></p>

+0

感謝您的幫助,但這需要完全不同的編寫代碼的方式。有沒有簡單的方法來改變我寫的代碼來解決我的問題? – ChaseHardin

+0

不知道你的意思有什麼不同,它幾乎與你的代碼有着不同的命名約定。你沒有在你的代碼中包含的唯一變化是KO綁定的初始化,而不是替換數據值,你可以將'ko.mapping.fromJS(data,{},_this.PersonInfo()) ;'或者只是'this.PersonInfo(data)'。您可以在http://knockoutjs.com/documentation/plugins-mapping.html – kasperoo