Knockout JS:将可观察数组作为参数传递

时间:2014-05-20 16:22:35

标签: javascript arrays knockout.js arguments observable

我有一个名为textFields的二维可观察数组:

var t1 = ko.observableArray([{val: 0}, {val:0}])
self.textFields = ko.observableArray([t1]);

我有一个名为solve的函数应该带参数:

self.solve = function(arr){
console.log(arr);
}   

在我的html中,我将该函数与链接点击相关联,该链接点击将textFields作为参数传递来解决:

<a id='solveBtn' href='#' data-bind='click: solve(textFields)'>Solve</a>

我以为我现在打开了textFields-array。但相反,我得到[]。当我在Chrome中查看调试器中的变量时,我也只看到[]。这是为什么?为什么textFields没有正确传递来解决?

编辑:

我现在让js看起来像这样:

self.solve = function(arr){
console.log(arr());
}   

但是我知道我想将这个可观察的数组传递给另一个函数(它应该是一个正常的数组:

var normalize = function(arr){
    var retArr = [];
    console.log(arr().length);
    for(var i = 0; i < arr.length; i++){
        var temp = [];
        for(var j = 0; j < arr()[i]().length; j++){
            temp.push(arr()[i]()[j].val);
        }
        console.log(temp);
        retArr.push(temp);
    }
    return retArr;
}

console.log(arr())给出了以下错误:消息:对象不是函数。当我将arr视为普通数组时,永远不会执行for循环。我猜是因为arr [i]的长度为0。

非常感谢您的回答!

1 个答案:

答案 0 :(得分:1)

尝试在标记中执行此操作以获取解决方法中的数组值

<a id='solveBtn' data-bind='click: function(){solve(textFields())}'>Solve</a>

或修改您的脚本如下

self.solve = function(arr){
        console.log(arr());
}

快速注释:在示例标记中,您要设置一个带有click事件参数的函数。这将导致在页面加载期间执行该函数。将它包装在功能块中总是安全的,如下所示。

<a id='solveBtn' data-bind='click: function(){solve(textFields)}'>Solve</a>