我正在学习 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 方法。就像这个类似的问题仅从 observableArray 获取修改行的最佳方法(当有批量编辑选项时)。当我尝试重建我的视图模型以遵循此示例时,我在 foreach 上收到错误:客户(与 DirtyItems 相同的错误)。
这是一个很有希望的问题,但答案再次使用了其他 Javascript 方法Knockoutdirty flag event
任何建议表示赞赏!