【发布时间】:2011-12-06 06:26:35
【问题描述】:
我正在使用基于示例http://jsfiddle.net/rniemeyer/A9NrP/ 的 SlickGrid 和 knockout.js
我有网格填充和添加按钮按照示例工作。我遇到的问题是,当我通过 ko.dependentObservable 更新视图模型的 rows 属性时,会触发 ko.bindingHandlers 的“更新”部分,但光滑的网格不会接受更改。
定义绑定的html:
<div id="grid" data-bind="slickGrid: { data: rows, columns: columns }"></div>
SlickGrid 代码(与示例相同):
var grid;
ko.bindingHandlers.slickGrid = {
init: function (element, valueAccessor) {
var settings = valueAccessor();
var data = ko.utils.unwrapObservable(settings.data);
var columns = ko.utils.unwrapObservable(settings.columns);
var options = ko.utils.unwrapObservable(settings.options) || {};
grid = new Slick.Grid(element, data, columns, options);
},
update: function (element, valueAccessor, allBindingAccessor, viewModel) {
var settings = valueAccessor();
// I can see the correct data here but the grid does not update
var data = ko.utils.unwrapObservable(settings.data);
grid.render();
}
}
我的模特:
myViewModel = {
data : ko.observableArray(),
tabs: ['High', 'Medium', 'Low'],
rows : ko.observableArray([]),
columns : [
{
id: "id",
name: "ID",
field: "id"
},
{
id: "Location",
name: "Location",
field: "Location"
},
{
id: "Comment",
name: "Comment",
field: "Comment"
}
],
addItem: function() { // this works and SlickGrid adds a new row
this.rows.push(new ModelRow(0, "New", 5.00));
},
}
调用 ajax 并触发 ko.bindingHandlers.slickGrid.update 但 slickgrid 似乎没有接收更改的代码,ajax 确实返回有效数据,并在用户单击链接时触发:
ko.dependentObservable(function () {
if (this.data.lastAlarmRequest) this.data.lastAlarmRequest.abort();
this.data.lastAlarmRequest = $.get("/audit/alarmsdata/high", null, this.rows);
}, i2owater.viewmodels.AlarmsForViewModel);
为什么 addItem 函数有效,而 ko.bindingHandlers.slickGrid.update 无效?在更新功能中,我可以看到网格应该绑定到的正确数据。 是不是因为rows属性中的所有数据都被覆盖了?
更新: 我试过使用 grid.invalidate();但它不起作用,并且还看到 addItem 函数在执行 ko.dependentObservable 后停止工作
【问题讨论】:
-
你解决过这个问题吗?我也有同样的问题
-
嗨 Danny,恐怕我还没有修复它,我不得不停止使用 KO 绑定并将 jquery 与 SlickGrids dataView 对象一起使用,我确实想回到这个并开始工作与KO。只是不能说我什么时候能解决。如果您比我做得更进一步,请告诉我。
标签: knockout.js slickgrid