【问题标题】:In Javascript, is there a way to evaluate a variable that may or may not be a function在Javascript中,有没有办法评估一个可能是也可能不是函数的变量
【发布时间】:2013-10-24 13:34:02
【问题描述】:

我有一个复杂的 javascript 变量,其中有许多嵌套变量,每个变量都可以包含自己的嵌套变量...当我进行淘汰赛映射时,有时嵌套变量被设置为对象,而其他时候那些完全相同的变量是函数。因此,当我对这些嵌套变量的数据绑定期待下一次对象时,当变量现在是一个函数时,绑定不会更新。

下面的小提琴给出了我所看到的一个想法:

http://jsfiddle.net/Eves/AUcGM/2/

html:

<p> <span>Name:</span>
 <span data-bind="text: TempData().objectA.Name"></span>

    <button id="update" data-bind="click: Update">Update!</button>
</p>

Javascript:

var ViewModel = function (data) {
    var me = this;
    me.TempData = ko.observable(data);

    me.Update = function () {


        ko.mapping.fromJS(temp2, {}, me);
    };

    return me;
};

var temp1 = {
    objectA: {
        Name: 'temp1.objectA.Name'
    }
};
var temp2 = {
    objectA: function () {
        this.Name = 'temp2.objectA.Name';
        return this;
    }
};
window.viewModel = ko.mapping.fromJS(new ViewModel(temp1));
ko.applyBindings(window.viewModel);

最初跨度文本显示“temp1.objectA.Name”。但是,如果您单击更新按钮并且绑定从 temp1 对象切换到 temp2 对象,因为“objectA”现在是一个函数,数据绑定永远不会更新。如果我将跨度的数据绑定更改为“TempData().objectA().Name”,那么 temp2 将正常工作……但随后会破坏 temp1。

所以问题是:

有没有办法始终将变量评估为对象或函数?

我怀疑我可以使用 ko.computed 来始终获得适当的值,而不管函数或对象如何。但考虑到我真正处理的对象的复杂性,这会变得非常混乱。

【问题讨论】:

    标签: javascript knockout.js knockout-mapping-plugin


    【解决方案1】:

    我没有阅读你的整个问题,但有一个快速的答案 -

    var returnedValue = ko.unwrap(possibleFunction);
    

    (在旧版本的 ko 中,这是 ko.utils.unwrapObservable)

    使用 this 的一个好方法是在自定义绑定处理程序中解包值,无论它是否是函数。

    ko.bindingHandlers.returnAction = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var value = ko.unwrap(valueAccessor());
            // now value is a value no matter what the element's value was set as
    
            $(element).keydown(function (e) {
                if (e.which === 13) {
                    value(viewModel);
                }
            });
        }
    };
    

    编辑

    这是一个传入各种对象的工作小提琴示例 - http://jsfiddle.net/5udhU/3/

    这演示了传递一个字符串、一个可观察对象、一个计算对象和一个都可以正确评估的函数。

    【讨论】:

    • 我很难弄清楚在哪里可以使用 unwrap 来满足我的需要。
    • 您的问题是“如果它是一个值或返回值的函数,我如何评估(获取对象的返回值)?”答案是 ko.unwrap() 如果你传入任何东西,它就会返回值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多