2012-08-13 53 views
0

單個記錄我有一個基本的表格設置使用淘汰賽,但我不知道是否有什麼辦法可以編輯/保存單個記錄,而不是拯救整個視圖模型每次改變了嗎?這裏是我的代碼...如何保存與淘汰賽

<tbody data-bind="foreach: movies"> 
    <tr> 
     <td data-bind="text: title"></td> 
     <td data-bind="text: releaseDate"></td> 
     <td data-bind="text: genre"></td> 
     <td data-bind="text: price"></td> 
     <td><input type="button" value="Edit" id="edit"/></td> 
    </tr> 
    <tr class="editable"> <!-- hide this initially, only show when edit button is clicked --> 
     <td><input id="titleInput" data-bind="value: title" /></td> 
     <td><input id="releaseDateInput" data-bind="value: releaseDate" /></td> 
     <td><input id="genreInput" data-bind="value: genre" /></td> 
     <td><input id="priceInput" data-bind="value: price" /></td> 
    </tr> 
<!-- save button/form or something here containing ONLY this record --> 

</tbody> 
</table> 


<script type="text/javascript"> 

function Film(data) { 
    this.title = ko.observable(data.Title); 
    this.releaseDate = ko.observable(data.ReleaseDate); 
    this.genre = ko.observable(data.Genre); 
    this.price = ko.observable(data.Price); 
} 

function MovieListViewModel() { 
    var self = this; 
    self.movies = ko.observableArray([]); 
    self.title = ko.observable(); 
    self.releaseDate = ko.observable(); 
    self.genre = ko.observable(); 
    self.price = ko.observable(); 

    $.getJSON("/Movies/GetAllMovies", function (allMovies) { 
     var mappedMovies = $.map(allMovies, function (movie) { return new Film(movie) }); 
     self.movies(mappedMovies); 
    }); 
} 

ko.applyBindings(new MovieListViewModel()); 

有什麼想法?謝謝!

回答

3

其實,通過神奇的binding contexts,這很簡單!

  1. 第一步。將以下元素放置在您的foreach模板中的任何位置。

    <button data-bind="click: $root.saveMovie">Save</button> 
    
  2. 第二步。該saveMovie方法添加到您的視圖模型

    self.saveMovie = function(movie) { 
        $.ajax({ 
         type: "POST", 
         url: "/someurl", 
         dataType: "json", 
         contentType: "application/json", 
         data: ko.toJSON(movie), 
         success: function(result) { 
          //... 
         } 
        }); 
    } 
    

movie變量將包含你的foreach循環的項目!爲什麼?因爲在淘汰賽中,我們有驚人的功能,稱爲結合上下文:

A結合上下文是認爲你可以從你的綁定引用 數據的對象。在應用綁定時,自動敲除 創建並管理綁定上下文的層次結構。的 層次結構中的根級別是指你提供給 ko.applyBindings(視圖模型)的視圖模型參數。然後,每次使用控制流程 (例如with或foreach)時,都會創建引用嵌套視圖模型數據的子綁定上下文 。

http://knockoutjs.com/documentation/binding-context.html

+0

我有現在得到這個控制器唯一的問題......我看着這個http://stackoverflow.com/questions/4656232/pass-object-from -json-into-mvc-controller-its-always-null當我這樣做時... window.location ='/ Movies/SaveMovie?movie ='+ movie;在self.updateMovie方法中,它調用方法,但數據沒有正確映射或者什麼,想知道你是否有任何想法?這裏是控制器方法(具有細節視圖):public ViewResult UpdateMovie(MovieViewModel movie) { return View(「TestView」,movie); } – 1Canuck16 2012-08-13 19:44:10

+2

你可以發佈saveMovie()的代碼嗎?在那裏,您應該創建一個反映MovieViewModel並執行$ .post的JSON對象。或者發佈表示MovieViewModel的FORM。 – 2012-08-13 19:47:30

+1

好的。從我的iPhone,可能不會很漂亮:$ .ajax('/ echo/json /', data:ko.toJS(movie), type:'post', success:function(data){ }, dataType:'json' }); – 2012-08-13 19:53:35