2016-07-22 57 views
0

我知道這可能看起來太簡單了,但我想了解Knockout是如何工作的。我究竟做錯了什麼 ?我需要爲每個學生獲得關於「註釋」的數據,但是我嘗試的方法似乎不起作用...我會很感激任何形式的幫助或建議。Knockout.JS:獲取數據

<table data-bind="foreach: students"> 
     <tr> 
      <th>ID</th> 
      <th>Nume</th> 
      <th>Prenume</th> 
      <th>Data</th> 
     </tr> 
     <tr> 
      <td><input type="text" size="1" data-bind="value: StudId" disabled="disabled"></td> 
      <td><input type="text" size="60" data-bind="value: Nume" disabled="disabled"></td> 
      <td><input type="text" size="60" data-bind="value: Prenume" disabled="disabled"></td> 
      <td> 
       <input type="text" size="15" data-bind="value: Data" disabled="disabled"> 
       <input data-bind="click: $parent.deleteStudent.bind($parent, $data.StudId)" type="button" value="Sterge" class="button button1" id="sterge" /> 
       <input data-bind="click: function() { $parent.loadNote.bind($parent, $data.StudId); alert(NotaId); }" type="button" class="button button2" value="Note" /> 
      </td> 
     </tr> 
    </table> 

和基因敲除一個:

<script type="text/javascript"> 
     var uri = 'api/student'; 

     var StudentsViewModel = function() { 
      this.students = ko.observableArray(); 
      this.note = ko.observableArray(); 

      this.loadNote(); 
      this.loadStudents(); 
     }; 

     StudentsViewModel.prototype.loadStudents = function() { 
      var self = this; 
      $.getJSON(uri, function (data) { 
       self.students(data); 
      }); 
     }; 

     StudentsViewModel.prototype.loadNote = function (id) { 
      var self = this; 
      $.getJSON(uri + '/' + id, function (data) { 
       self.note(data); 
      }); 
     }; 
// Apply bindings 
     ko.applyBindings(new StudentsViewModel()); 

爲什麼它不顯示「注意」,當我按下按鈕爲每個學生?

+1

由於您收到HTTP錯誤400(錯誤的請求),您必須檢查生成此錯誤的服務器端腳本。您也可以檢查瀏覽器的devtools中的所有網絡請求和響應(默認爲F12鍵)。 –

回答

1

當你在一個函數上調用bind時,該函數不是,被稱爲。相反,bind返回一個新的功能與綁定this上下文和可選的綁定參數。

這意味着該函數:

function() { 
    $parent.loadNote.bind($parent, $data.StudId); 
    alert(NotaId); 
} 

不會叫loadNote。你需要另一組括號調用新創建的函數:

$parent.loadNote.bind($parent, $data.StudId)(); 

最好是在你的數據結合不會產生新的功能,特別是如果你不是真正熟悉淘汰賽。它可能會與click參數和bindingContext有點混亂。

我建議在您的視圖模型中添加一個onLoadNoteClick方法,將綁定更改爲click: onLoadNoteClick,並在此方法中創建一個斷點。然後,您可以檢查arguments以查看傳遞的內容,並查看this以查看方法的上下文。

+0

我收到「無法加載資源:服務器響應狀態爲400(錯誤請求)」 – Florin

0

在你的函數loadNote,設置var self=this;

正如錯誤說,有在目前封閉無note功能。 嘗試在構造函數中設置self,但不要將其限制爲構造函數作用域,以便稍後調用它。

var uri = 'api/student'; 
var self; 
var StudentsViewModel = function() { 
    self=this; 
    this.students = ko.observableArray(); 
    this.note = ko.observableArray(); 
    this.loadNote(); 
    this.loadStudents(); 
    }; 
+0

無法加載資源:服務器響應狀態爲400(錯誤請求) – Florin

+0

我該如何解決它? – Florin

+0

正如@f_martinez在他的評論中提到的那樣,你現在可以做的最好的事情是使用瀏覽器工具(F12)檢查你正在使用的服務器的調用。你的knockout/javascript很可能工作得很好,但是你的服務器調用不正確。 您是否已經測試過$ .getJSON('api/student /'+ searchingId)'並查看了它返回的內容? –