Javascript 传递一个函数,该函数返回ko的值

Javascript 传递一个函数,该函数返回ko的值,javascript,knockout.js,Javascript,Knockout.js,我有两个函数generate和test。当用户单击按钮时,将调用生成,然后调用测试函数。我收到以下错误: 传递一个返回ko.computed值的函数 此错误在测试函数的此行中抛出: var unmapped = ko.mapping.toJS(this); 这是我的viewmodel,具有可观察属性 下面是两个函数。如果我将test函数的内容移动到generate中,一切正常,但我需要将逻辑置于两个不同的函数中。我能做什么 我被困在这里了。任何帮助都将不胜感激 generate = func

我有两个函数
generate
test
。当用户单击按钮时,将调用生成,然后调用测试函数。我收到以下错误:

传递一个返回ko.computed值的函数

此错误在测试函数的此行中抛出:

var unmapped = ko.mapping.toJS(this); 
这是我的viewmodel,具有可观察属性

下面是两个函数。如果我将
test
函数的内容移动到
generate
中,一切正常,但我需要将逻辑置于两个不同的函数中。我能做什么

我被困在这里了。任何帮助都将不胜感激

generate = function () {
            if (!omega.validatableFranchiseGeneration.validate()) {
                return false;
            }
            omega.franchiseInfo.IsForGeneration(true);

            test();
        }

 var test = function () {
        getIpsAndPorts();

        for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) {
            if ($.isArray(omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel)) {
                omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel = omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel[0];
            }
        }

        var unmapped = ko.mapping.toJS(this);

        var jsonData = ko.toJSON(unmapped);
        $.ajax({
            url: "/franchise/Save",
            type: "POST",
            // data: ko.toJSON({ folderName: FolderName }),
            data: { franchiseInfoViewModel: jsonData },
            //traditional: true,
            //contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (data, textStatus, xhr) {
                window.location.href = data.redirectToUrl;
            },
            error: function (request, status, error) {
                jsonValue = jQuery.parseJSON(request.responseText);
                omega.franchiseInfo.errorMessages([]);
                for (var i = 0; i < jsonValue.errorMessages.length; i++) {
                    omega.franchiseInfo.errorMessages.push({ errorMessage: ko.observable(jsonValue.errorMessages[i].ErrorMessage) });
                }
                for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) {
                    InitializeViewLanguagesInfo(omega.franchiseInfo.LanguagesInfoViewModel()[i]);
                }
            }
        });
    }   
generate=函数(){
如果(!omega.validableGeneration.validate()){
返回false;
}
omega.特许经营信息是伪造的(真);
test();
}
var测试=函数(){
getIpsAndPorts();
对于(var i=0;i
在没有看到所有代码的情况下,很难确定这一点,但是如果直接包含在generate中的代码(原样)能够正常工作,那么我愿意打赌
这个
不是您认为的
测试
函数<代码>此
测试
函数中的含义与在
生成
中的含义不同

启动Chrome或Firebug,并在
var unmap=ko.mapping.toJS上设置断点(此)行。运行您的程序,当断点点击时,转到控制台并查看
。这是你的模型吗

如果
这个
是您在
生成
中所期望的,您可以像这样调用
测试

test.apply(this);
这将为方法调用显式设置
This
的上下文

另一个选项是在ViewModel内设置
self
变量。这通常在顶部完成,看起来像:
var self=This。通过创建此变量,您可以在外部“函数”范围内的任何函数中引用
self',而不必担心该`波动'的值

--

下面是一个简单的小提琴来模拟我认为正在发生的事情:


打开Chrome或Firebug控制台,查看记录的对象。请注意,
窗口
是我刚才调用
updatea()
时记录的对象,但在最初的单击函数中以及调用
updateb.apply(此)
updatec()
(引用了
self
)时是
对象。

谢谢您的回答。我重构了我的逻辑,转而使用另一种解决方案。尽管如此,我还是接受了你的回答。