javascript - 在 Javascript 中,有没有一种方法可以评估可能是也可能不是函数的变量

标签 javascript knockout.js knockout-mapping-plugin

我有一个复杂的 javascript 变量,里面有许多嵌套变量,每个嵌套变量都可以包含自己的嵌套变量...当我做我的 knockout 映射时,有时嵌套变量被设置为对象,而其他时候那些完全相同的变量是功能。因此,当我对那些嵌套变量的数据绑定(bind)在下一次期待一个对象时,当变量现在是一个函数时,绑定(bind)不会更新。

下面的 fiddle 给出了我所看到的内容的想法:

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”。但是,如果您单击更新按钮并且绑定(bind)从 temp1 对象切换到 temp2 对象,因为“objectA”现在是一个函数,数据绑定(bind)永远不会更新。如果我将 span 的数据绑定(bind)更改为“TempData().objectA().Name”,那么 temp2 将正常工作...但是这会破坏 temp1。

所以问题是:

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

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

最佳答案

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

var returnedValue = ko.unwrap(possibleFunction);

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

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

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);
            }
        });
    }
};

编辑

这是传递各种对象的工作 fiddle 示例 - http://jsfiddle.net/5udhU/3/

这演示了传递一个字符串、一个可观察对象、一个计算对象和一个函数,它们都可以正确求值。

关于javascript - 在 Javascript 中,有没有一种方法可以评估可能是也可能不是函数的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19567493/

相关文章:

javascript - 添加一个书签,它只是 javascript,不是 URL

javascript - 如何在 Knockout View 模型中的每个函数内迭代匿名函数

javascript - 将 json 数组映射到 ko 抛出错误

javascript - 如何轻松地将自定义字体放入 HTML5 Canvas 中?

javascript - 如何将数据从 JavaScript 代码传递到 Polymer 自定义元素?

javascript - 在基于 Strophe.js 的聊天应用程序中处理状态

javascript - Knockout.js 2.0.0 - 在此示例中如何设置 bool 值?

javascript - knockout 不会更改对象数组中的复选框状态

knockout.js - knockout 映射+添加到可观察数组