我在我的MVC项目中使用了敲除(KO)。我在服务器上创建一个MVC模型(用于网格)并将其传递给视图。在视图上,它被序列化并转换成KO模型(使用ko.mapping),然后将其用于绑定。该绑定然后用于HTML创建网格。可观察数组的敲除映射似乎不起作用
这是我的MVC网格模型看起来像这反过来又被转换成相应的KO模型由ko.mapping:
public class GridModel
{
/// <summary>
/// Grid body for the grid.
/// </summary>
public GridBodyModel GridBodyModel { get; set; }
/// <summary>
/// Grid context.
/// </summary>
public GridContext GridContext { get; set; }
/// <summary>
/// Grid header for the grid.
/// </summary>
public GridHeaderModel GridHeader { get; set; }
}
public class GridBodyModel
{
/// <summary>
/// List of grid body rows.
/// </summary>
public IList<GridRowModel> Rows { get; set; }
}
public class GridContext
{
/// <summary>
/// Total number of pages. Read-only.
/// </summary>
public int TotalPages{ get; set; }
}
public class GridHeaderModel
{
/// <summary>
/// List of grid header cells.
/// </summary>
public IList<GridHeaderCellModel> Cells { get; set; }
}
因为它是明确的主要模型类GridModel由以下类别它们是作为属性呈现:
GridBodyModel:具有要在网格体中呈现的行的列表。
GridContext:具有总页数作为属性。它还有其他属性,但这不在本讨论的范围之内。
GridHeaderModel:具有必须在网格标题中显示的单元格列表。
然后我有这个脚本,将执行新的页面加载。
$(document).ready(function() {
// Apply Knockout view model bindings when document is in ready state.
ko.applyBindings(Global_GridKOModel, document.getElementById("gridMainContainer"));
});
// Serialize the server model object. It will be used to create observable model.
Global_GridKOModel = ko.mapping.fromJS (<%= DataFormatter.SerializeToJson(Model) %>);
Global_GridKOModel是全局JavaScript变量。 模型是来自服务器的MVC网格模型。
用户可以再次在页面上执行进一步搜索。我通过使用Ajax发布新的搜索条件来处理这个问题。在这篇文章中,创建了一个新的MVC模型,并将其作为Ajax响应发回。然后使用这个新的MVC模型来简单地使用ko.mapping来更新Global_GridKOModel,这反过来刷新了刚刚在新鲜页面加载时构建的网格(具有新数据)。我就是这么做的。
$.ajax({
url: destUrl,
data: dataToSend
success: function (result) {
ko.mapping.fromJS(result, Global_GridKOModel);
},
error: function (request, textStatus, errorThrown) {
alert(request.statusText);
}
});
除了在以下情况下,一切正常。
发出Ajax请求,其中没有结果返回,即GridBodyModel和GridHeaderModel在模型GridModel中为null。那次电网正确地表明没有找到记录。这是对的。这发生在下面的HTML绑定中。
<!-- When no record is found. -->
<div data-bind="ifnot: GridContext.GridPager.TotalPages() > 0">
No record(s) were found.
</div>
<!-- This is actual grid table container. This is binded when records are found -->
<div data-bind="if: GridContext.TotalPages() > 0">
Grid construction happens here
</div>
现在,在此之后,如果另一Ajax请求制作,但这次返回的记录(我检查与萤火虫的响应,并确认记录是否确实返回)。这次网格构建发生在访问各种可观察数组的地方。例如,为网格构建分页器,下面是我写的一段HTML绑定。
<td data-bind="attr:{colspan: GridHeader.Cells().length }">
这次KO抛出下面的错误,可以在萤火虫中看到。
无法解析绑定。 消息:TypeError:GridHeader.Cells不是函数; 绑定值:ATTR:{列跨度:GridHeader.Cells()}长
它工作得很好,只要有返回的记录,但之后如上所述返回没有记录它打破。请注意,在没有记录返回时,GridHeader在先前的响应中为null。我在ko.mapping中闻到一些可疑的东西。我认为映射可观察数组时存在一些问题。
那么,我做得不好的是什么?请人吗?
如果我没有明确提及,请随时提出澄清。
在此先感谢。
非常感谢Artem花时间阅读。是的你是对的,null不应该返回。我也是昨晚想出来的,但没有发布。请在下面阅读我的回答,我已经提到了我的观察结果,并且它完全反映了您所说的内容。 – Aum