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());

有什么想法吗?谢谢!

4

1 回答 1

3

实际上,通过绑定上下文的魔力,这很容易!

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

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

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

movie变量将包含您的 foreach 循环的项目!为什么?因为在 Knockout 中,我们有一个惊人的特性,称为绑定上下文:

绑定上下文是一个对象,其中包含您可以从绑定中引用的数据。在应用绑定时,Knockout 会自动创建和管理绑定上下文的层次结构。层次结构的根级别是指您提供给 ko.applyBindings(viewModel) 的 viewModel 参数。然后,每次您使用控制流绑定(例如 with 或 foreach)时,都会创建一个引用嵌套视图模型数据的子绑定上下文。

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

于 2012-08-13T19:11:54.243 回答