我正在学习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
感谢任何建议!
答案 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)”调用移动到计算函数并绑定到该函数。