从observableArray- knockoutjs删除(remove from observa

2019-09-21 23:21发布

我敢肯定,这将是为别人一个简单的答案。 我有以下视图模型:

@{
    var initialData = new JavaScriptSerializer().Serialize(Model);
}
var data = @Html.Raw(initialData);
function ViewModel(data) {
    var self = this;
    self.Name = ko.observable(data.Name);
    self.Items = ko.observableArray(data.Items);
    self.addItem = function() { self.Items.push(""); };
    self.removeItem = function(data) { self.Items.remove(data); }
}
$(document).ready(function() {ko.applyBindings(new ViewModel(data)); });

而下面的观点:

<div>
    Name: <span data-bind="text: Name"></span>
</div>
<div>
    Items: <button data-bind="click: addItem">Add Item</button>
</div>
<div>
    <table>
        <tbody data-bind="template: { name: 'itemTemplate', foreach: Items }"></tbody>
    </table>
</div>
<script type="text/html" id="itemTemplate">
    <tr>
        <td>
            <input data-bind="value: $data" />
            <a href="#" data-bind="click: function() {$parent.removeItem($data)}">Remove Item</a>
        </td>
    </tr>
</script>

一切似乎除了正常工作removeItem 。 当新行已被添加,以及“删除项目”上点击一个空的新行,所有新的行会与它被移除。 我已经看了吨淘汰赛教程试图得到这个工作,我的方法似乎是一个有效的尝试,但很明显......我必须失去了一些东西。 有什么建议么?

Answer 1:

remove一个observableArray的函数循环通过阵列并删除匹配传递给它的值,该值的任何项目。 在你的情况,你只是处理字符串,它会看到所有新的(没有值)将匹配“”。

有几个方法来处理它:

  • 你可以处理的对象,而不是就像串{ value: ko.observable("") } 。 然后,当你通过$data只会删除该对象引用符合实际的项目。 如果你的价值是无法观察到的,是数据本身(而不是属性),那么你写实际上不会使其恢复到您的视图模型。

  • 如果不适合您的方案工作,那么你可以删除基于索引(项目$index使用拼接)。

我可能会不喜欢它: http://jsfiddle.net/rniemeyer/N3JaW/

还要注意的是, eventclick是一个包装到event )的结合将通过目前的数据作为第一个参数的处理程序,让您可以简化结合click: $parent.removeItem

更新 :这里是你可以控制你的对象是如何转换成JSON几种方法:

  • ko.toJSON传递到第2和第3的参数JSON.stringify 。 第二ARG让我们运行一个函数来描述可能取代值这里 。 下面是检查是否关键是一个数字(数组项)的样品,它有一个value属性。 如果是这样,它只是返回字符串而不是对象。 http://jsfiddle.net/rniemeyer/N3JaW/1/

  • 如果你使用一个构造函数为对象,那么你就可以覆盖toJSON所描述的功能在这里 。 下面是使用这个功能您的样本: http://jsfiddle.net/rniemeyer/N3JaW/2/

  • 可以使用的另一种技术是保持一个可观察到的计算具有“良好的”值。 下面是示例: http://jsfiddle.net/rniemeyer/N3JaW/3/ 。 在这一个Items是计算观察到,返回清洁值。 Items.asObjects包含你的价值观的对象版本。 当转换成JSON,将asObjects当部分自然落下Items转换为JSON。 如果您只转换为JSON时,需要这个“好”的阵列,那么其他的选项是获得更好的性能(他们当你想送它仅计算)。



文章来源: remove from observableArray- knockoutjs