【问题标题】:Knockout.js Observing members of a pre-existing API objectKnockout.js 观察预先存在的 API 对象的成员
【发布时间】:2013-02-08 11:56:59
【问题描述】:

我已经编写了一个大数据 API,在我们的 Web 应用程序之外的几个位置使用,我想将敲除功能集成到应用程序中。似乎通过淘汰赛,您可以创建一个带有可观察对象的模型。我想不通的是一种在我们的 API 中观察预先存在的值的方法。这甚至可能吗,还是我需要一个中间模型来来回推送数据?这似乎非常不方便且效率低下。我错过了什么明显的东西吗?

在下面的代码中,我想观察 name 属性。我想在这里获得最佳方法的建议?

编辑:首选的方法是将观察者附加到已经存在的属性,而不是围绕敲除编写我的 API 或在 API 之上编写一个额外的包装器。这个 API 与一些非浏览器应用程序共享,我认为这消除了使用敲除编写整个 API 而不增加额外复杂性的可能性。我愿意考虑其他可以满足我需要的框架。

myAPI.user = {
    ...
    get name() {
        return myAPI.user.object.name;
    },
    set name(x) {
       myAPI.user.setProperty('name', x);
    }
    ...
};

【问题讨论】:

    标签: javascript web-applications mvvm knockout.js viewmodel


    【解决方案1】:

    您可以编写自定义computed

    var VM = function() {
       this.apiUserName = ko.computed({
           read: function() { return myAPI.user.object.name; },
           write: function(value) { return myAPI.user.setProperty('name', value); },
           owner: this
       });
    }
    

    现在,如果 myAPI.user.object.name 发生变化并且您有活动,请致电 valueHasMutated

    // inside your event
    vm.apiUserName.valueHasMutated();
    

    【讨论】:

    • 如果我错了,请纠正我,你告诉我 valueHasMutated 如果名称从外部来源更改,则需要调用。
    • 他说如果myAPI.user.object.name发生变化就调用它,这样Knockout就会收到变化的通知。
    • @Daniel A. White 虽然这个解决方案确实有效,但我真的不太喜欢它,因为它增加了另一层复杂性。我只是使用敲除重写 API,所以我没有复制包装器,但我不确定在使用 javascript 的非基于浏览器的应用程序中的效果是什么。不幸的是,我不能简单地将事件“观察者”附加到已经存在的属性或对象上。感谢您的意见。
    • 这似乎不起作用,因为apuUserName没有名为valueHasMutated()的方法
    • 你能分享一下你是怎么称呼它的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多