Performance knockout.js和最快的模板引擎

Performance knockout.js和最快的模板引擎,performance,knockout.js,template-engine,dot.js,Performance,Knockout.js,Template Engine,Dot.js,我需要一个比内置的knockout.js更快的模板引擎。最快的是什么?如何设置?网上有什么例子吗?我一直在想doT.js或handlebar。我想等JsRender,但表现不太好。 < P>强>这个答案不再准确。敲除2.2现在支持通过foreach绑定对元素进行重新排序。 knockout和observearray的主要问题是,所有修改数组的操作都会导致foreach绑定下面的元素完全重新排序。如果这成为性能瓶颈,您可以通过不移动行而是复制行的值来解决 在每次更改时重新发布整个foreach的明

我需要一个比内置的knockout.js更快的模板引擎。最快的是什么?如何设置?网上有什么例子吗?我一直在想doT.js或handlebar。我想等JsRender,但表现不太好。

< P>强>这个答案不再准确。敲除2.2现在支持通过foreach绑定对元素进行重新排序。

knockout和
observearray
的主要问题是,所有修改数组的操作都会导致
foreach
绑定下面的元素完全重新排序。如果这成为性能瓶颈,您可以通过不移动行而是复制行的值来解决

在每次更改时重新发布整个
foreach
的明显方式如下所示:

function Row(value) {
    this.value = value;
}
var model = {
    rows = ko.observableArray([new Row(1), new Row(2), new Row(3), new Row(4), new Row(5)])
}
function move(index, insertionIndex) {
    var rows = models.rows();
    // TODO Insert some clever code here
    // - remove row from rows array
    // - insert row at insertionIndex into rows array
    rows.valueHasMutated();
}
因为这将重新绘制整个表,所以这可能不是您想要的。更好的方法是支持复制的可变行元素:

function Row(value) {
    this.value = ko.observable(value);
}
Row.prototype.copyFrom(anotherRow) {
    this.value(anotherRow().value());
}
Row.prototype.swap(anotherRow) {
    var tmp = this.value();
    this.value(anotherRow.value());
    anotherRow.value(tmp);
}
var model = {
    rows = ko.observableArray([new Row(1), new Row(2), new Row(3), new Row(4), new Row(5)])
}
function move(index, insertionIndex) {
    var rows = models.rows();
    var tmp = new Row();
    tmp.copyFrom(rows[index]) // save the current row
    if (index < insertionIndex) {
        // move row down -> move other rows up
        for (var i=index; i<insertionIndex; i++) {
            rows[i].copyFrom(rows[i+1])
        }
    } else {
        // move row up -> move other rows down
        for (var i=index; i>insertionIndex; i--) {
            rows[i].copyFrom(rows[i-1])
        }
    }
}
函数行(值){
该值=可观察到的ko(值);
}
Row.prototype.copyFrom(另一行){
this.value(另一行().value());
}
Row.prototype.swap(另一行){
var tmp=this.value();
this.value(另一行.value());
另一行数值(tmp);
}
var模型={
行=ko.observearray([新行(1)、新行(2)、新行(3)、新行(4)、新行(5)])
}
函数移动(索引、插入索引){
var rows=models.rows();
var tmp=新行();
tmp.copyFrom(rows[index])//保存当前行
如果(索引<插入索引){
//下移行->上移其他行
对于(var i=索引;我向下移动其他行
对于(var i=索引;i>插入索引;i--){
行[i].copyFrom(行[i-1])
}
}
}
请注意,您不再需要使用
行。valueHasMutated()
,因为您不修改数组,而是更改
对象。因此,
foreach
绑定不会更新,您只会重新提交更改的行


如果knockout能够提供更强大的
observableArray
foreach
绑定处理程序实现,而不需要在更改时重新提交整个模板,那就太酷了。在此之前,如果您想坚持knockout,这是您的最佳选择。

我专门为快速表生成创建了一个绑定:。

我发现了这个错误,并让人在另一个问题上解决了它


你对内置模板引擎有什么问题?你有什么要求?你需要自动更新吗?我有一个类似Excel的网格,有100行拖放操作,我对其性能不满意。我读到内置引擎比外部模板慢。你使用了什么?这个问题仍然没有解决…我只是保留了我所有的,很难重做整件事。你考虑过doT吗?它看起来是目前可用的最快的一个。我的行是静态的,并且我已经在每个单元格中移动数据。但是我可以添加行。如果从数组中添加或删除项,Knockout不会重新呈现整个表。事实上,从2.2开始,如果您只是对项目重新排序,它将不会重新呈现任何内容()。我怎么会错过这个消息?我的答案已经过时了。对不起。我会试试看它是否有效。我有很多嵌套和匿名绑定,我们会看到的。JSFIDLE上有简单和复杂的示例吗?自述文件中有示例,spec/tableBinding.js中也有示例。我设计的绑定非常简单但是,我确信,您可以扩展绑定以满足您的需要。