使用remove元素敲除数据表绑定

时间:2013-09-19 02:32:05

标签: knockout.js datatable

我一直在尝试用knockout js绑定我的数据表。 我有一个按钮,用于向observableArray添加元素,有效地更新表。 对于每一行我都有一个删除按钮,问题是我可以第一次删除项目,然后表格更新。之后没有删除按钮工作。如果我添加一个项目并单击以删除其他项目,则删除似乎不起作用。 奇怪的是,如果我对表格进行排序或搜索(意味着更新它),则删除似乎是第二次工作。

这是我的代码

<script id="sample2RowTemplate" type="text/html">
 <td> <label data-bind="text: Id" /></td>
        <td> <input type="text" data-bind="value: Title" /></td>
        <td> <input type="text" data-bind="value: Price" /></td>      
        <td><a data-bind="click: function() { vm.removeGift($data); }">Remove</a></td>
    </script>

    var initialData = [{
    Id: 1,
    Title: 'Star Wars Blue Ray',
    Price: '90.00'}];
var initCounter = 1;

//define record class

function GiftRecord(id, title, price) {
    this.Id = ko.observable(id);
    this.Title = ko.observable(title);
    this.Price = ko.observable(price);
}

//map the records
var mappedData = ko.utils.arrayMap(initialData, function(item) {
    return new GiftRecord(item.Id, item.Title, item.Price);
});

//Build viewModel

function viewModel() {
    this.gifts = ko.observableArray(mappedData);
    this.addGift = function() {
        initCounter += 1;
        var title = $("#newTitle").val();
        var price = $("#newPrice").val();
        var rec = new GiftRecord(initCounter, title, price);
        this.gifts.push({
            Id: rec.Id,
            Title: rec.Title,
            Price: rec.Price
        });
    };
    this.removeGift = function(gift) {
        this.gifts.remove(function(item2) {
            return gift.Id == item2.Id;
        });
    };

    this.testUpdate = function() {
        this.gifts()[0].Title("test123");
    };

    this.save = function() {
        ko.utils.postJson(location.href, {
            gifts: ko.toJS(this.gifts()),
            guid: giftsSignalR.guid
        });
    };
}
vm = new viewModel();
//Bind viewModel to HTML
$(function() {
    ko.applyBindings(vm, $("#sample2")[0]);
});

与以下内容基本相同: http://jsfiddle.net/bdetchison/b4SsE/

请帮助......

1 个答案:

答案 0 :(得分:0)

使用您的代码似乎工作正常。我期待事情不起作用。通过将我的模型绑定到页面,我会做一些不同的事情......但这似乎有效::

http://jsfiddle.net/beauxjames/RYUHy/1/

现在......为了把它带到一个不同的方向,我会做以下的事情::

http://jsfiddle.net/beauxjames/RYUHy/

在这个模型中,我已经从模型中完全删除了对DOM的引用。最重要的是,请注意ko.mapping调用,看看礼物是如何被添加的,但它们的属性也会被自动观察。初始数据发生了一些细微的变化,我将这些礼物包装成一个命名对象......这使我有能力拥有一个父模型,并将这些礼物作为一个孩子保留。

var initialData = { 'gifts' : [ ... ] };

var giftMapping = {
    'gifts': {
        create: function (options) {
            if (options.data != null) return new GiftModel(options.data);
        }
    }
}

添加新礼物不再依赖于相关视图模型中对输入字段的引用。我在父模型中创建了一个名为newGift的属性,并使用data-bind =“with:newGift”属性将表单控件绑定到该属性。自从我这样做以来,我确实必须声明并初始化Gift Model中的属性......否则我可能会把它们排除在外。它们将初始化为初始数据作为可观察数据。

var GiftModel = function(data) {
    var self = this;
    self.Id = ko.observable();
    self.Title = ko.observable();
    self.Price = ko.observable();
    ko.mapping.fromJS(data, {}, self);
}

无论如何,希望这会有所帮助,并为您提供一种新的方式来看待事物。我认为随着向角度开始等平台的转变,这些方法变得更加普遍。