如何使用knockout datatables扩展名更新已编辑行的值?

时间:2013-04-20 17:13:04

标签: knockout.js

我使用knockout extension.im在数据表中加载超过1000行,使用map.fromjs将这些项映射到一个可观察的数组中,它确实减慢了页面的初始加载速度。

为了避免这种缓慢的初始加载,我试图将可观察数组设置为只用普通的json对象填充,这意味着数组中包含的1000多个对象是不可观察的。

但由于对象不可观察,因此在普通对象上进行编辑时,由于没有绑定,因此在数据表网格中没有看到更改。有没有办法让ui更改以适应普通编辑的json对象的新值?

我甚至尝试从可观察数组中删除已编辑的对象,但没有成功读取它。

2 个答案:

答案 0 :(得分:0)

您应该将每个项目的每个可编辑属性设置为observable。例如:

self.items = ko.observableArray(ko.utils.arrayMap(
    datasource,
    function(row){
        return {
            id: row.id,
            title: ko.observable(row.title)
        };
    }
));

不关心成千上万的物体;这个金额不是很大。

了解它如何与2,500个obj一起使用:http://jsfiddle.net/HfzvG/

答案 1 :(得分:0)

2500 objecs并不是很多... imo ...但是,我有一个项目试图用90,000 +行来实现这一点而且它实际上杀死了chrome ...解决方案是服务器端分页...我创建了每次请求少量行的敲除绑定分页。这些参数在我的存储过程中处理。您也可以使用服务器端语言处理分页参数。这需要更多的服务器访问,但权衡是值得的..

这里有一些SQL代码......

declare @rowCount int = 25;

Select MainSearchWithRowNumbers.*       
FROM
(SELECT
    ROW_NUMBER() OVER () As RowNumber
    ,Count(*) OVER () as TotalRows
    ,CEILING(CAST(Count(*) OVER () as FLOAT) / CAST(@rowCount as FLOAT)) AS TotalPages
    ,*
FROM
    (
     SELECT 
        -- ROW_NUMBER() OVER (ORDER BY CarcassRemovalId) AS AbsRowNumber
        Count(*) OVER () AS AbsTotalRows
        ,CEILING(CAST(Count(*) OVER () AS FLOAT) / CAST(@rowCount AS FLOAT)) AS AbsTotalPages
        ,*
     FROM YOURTABLE) 
    ) as MainSearch
) as MainSearchWithRowNumbers
WHERE
    (@page is null)
     or (
                (RowNumber <= @page * @rowCount)
            and (RowNumber > (@page - 1) * @rowCount)
    )