【问题标题】:Pass a function that returns the value of the ko.computed传递一个返回 ko.computed 值的函数
【发布时间】:2012-09-18 08:37:31
【问题描述】:

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

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

在测试函数的这一行抛出错误。:

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

this 是我的具有 ko.observable 属性的视图模型。

这是两个函数。如果我将 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]);
                }
            }
        });
    }   

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    如果没有看到您的所有代码,这很难确定,但如果代码(原样)直接包含在 generate 中时有效,那么我敢打赌 this 不是您认为的那样test 函数。 thistest 函数中的含义与在 generate 中的含义不同。

    启动 Chrome 或 Firebug 并在 var unmapped = ko.mapping.toJS(this); 行设置断点。运行您的程序,当断点命中时转到控制台并查看this。是你的 ViewModel 吗?

    如果this 是您在generate 中所期望的,您可以随时像这样调用test

    test.apply(this);
    

    这将为方法调用显式设置this 的上下文。

    另一种选择是在 ViewModel 中设置 self 变量。这通常在顶部完成,看起来像:var self = this;。通过创建此变量,您可以参考 self' inside any functions within the outer "function" scope, and not have to worry about the value ofthis` 波动。

    --

    这是一个简单的小提琴来模拟我认为正在发生的事情:http://jsfiddle.net/jearles/aLFWe/

    打开 Chrome 或 Firebug 控制台并查看记录的对象。请注意,当我刚刚调用 updatea() 时,Window 是记录的对象,但在原始点击函数中以及当我调用 updateb.apply(this)updatec()(引用 self)时是 Object

    【讨论】:

    • 感谢您的回答。我重构了我的逻辑并转向了不同的解决方案。不过我接受你的回答。
    猜你喜欢
    • 2013-06-01
    • 2015-08-25
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2013-04-20
    • 2021-04-10
    相关资源
    最近更新 更多