淘汰js列表与脏对象

时间:2013-02-04 21:17:04

标签: asp.net-mvc-4 knockout.js

我正在学习Knockout,而我却被困在一个看起来相当微不足道的问题上。下面是一些修改过的代码,但大部分来自Pluralsight课程。我正在使用MVC4,我的所有数据都来自JSON中的控制器。

Public Function GetData() As ActionResult

    Return Json(dataContext.GetData, JsonRequestBehavior.AllowGet)

End Function

这是我的观点

<ul data-bind="foreach: items">
        <li >
            <input type="text" id="name"  data-bind="value: name" />

        </li>
</ul>

我的观点模型:

    $(document).ready(function () {

    ko.dirtyFlag = function (root) {
        var result = function () { },
            _initialState = ko.observable(ko.toJSON(root))

        result.isDirty = ko.dependentObservable(function () {
            return _initialState() !== ko.toJSON(root);
        });

        result.reset = function () {
            _initialState(ko.toJSON(root));
        };

        return result;
    };


    function Customer(data) {
          this.name = ko.observable(data.name);
          this.id = ko.observable(data.id);
          this.dirtyFlag = new ko.dirtyFlag(this);
}



    var ViewModel = function (items) {
          var self = this;
          this.items = ko.observableArray([]);

          this.save = function () {
            alert("update");
                };

          this.addNew = function () {
            alert("add");
                };

          this.deleteItem = function () {
           alert("delete");
                 };

          this.dirtyItems = ko.computed(function () {
            return ko.utils.arrayFilter(this.items(), function (item) {
                return item.dirtyFlag.isDirty();
            });
           }, this);

          this.isDirty = ko.computed(function () {
            return this.dirtyItems().length > 0;
          }, this);

        $.getJSON("/home/GetCustomers", function (allData) {
                    var mappedLoadouts = $.map(allData, function (item) { return new     Customer(item) });
                    self.items(mappedLoadouts);
                });
          };

            ko.applyBindings(new ViewModel());

请注意,此代码已更改为简化示例。

我的第一个问题是,为什么这不起作用?我一直在找到'DirtyItems',有谁能告诉我为什么?我看不到范围问题,因为我指的是同一环境中的客户。

此外,到目前为止我找到的所有帮助都使用了不同的Javascript方法。就像这个类似的问题Best way to get only modified rows from observableArray (when there is bulk edit option)。当我尝试重建我的viewmodel以遵循此示例时,我收到了foreach上的错误:Customers(与DirtyItems相同的错误)。

这是一个很有希望的问题,但答案再次使用了其他Javascript方法Knockout dirty flag event

感谢任何建议!

2 个答案:

答案 0 :(得分:0)

我不确定,但我猜问题是Knockout需要你对DirtyItems进行限定,因为你在一个函数中使用它。

<div data-bind="text: ko.toJSON($root.DirtyItems)"></div>

如果您仍然遇到问题,可能需要发布一个重现问题的小提琴。

答案 1 :(得分:0)

我不知道这是否是问题的一部分,但是你的DirtyFlag代码中有一个拼写错误:

return ko.utils.arrayFilter(this.**Customerss**, function (item) {

这可能是犹大所说的,关于需要$ root。它也可能是一个约束/时间问题。什么是实际的JavaScript消息,DirtyItems是“未定义的”?

作为个人偏好,我尝试避免嵌入在HTML中的此类函数调用,因此我将“ko.toJSON(DirtyItems)”调用移动到计算函数并绑定到该函数。