首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >延迟异步计算可观测性

延迟异步计算可观测性
EN

Stack Overflow用户
提问于 2014-12-03 23:33:22
回答 1查看 1.9K关注 0票数 2

我一直在疯狂地想办法解决这件事。当异步调用完成时,我已经看到了许多模糊和难以实现的示例,这些例子都是在Knockout中可观察到的,但我似乎无法使用模块显示模式使其工作。

我试着创建一个只读的可观察的,因为这就是我所需要的。如果我不需要一个匿名函数来运行请求,我甚至都不会让人注意到这一点。以下是我的看法--模特:

代码语言:javascript
复制
eh.vm.skills = function () {

    //#region Public Variables

    var skills = ko.computed({
            read: function () {
                $.get("http://horodyski.me/api/skills", function (data) {
                    return data;
                });
            },
            deferEvaluation: true
        }),
    //#endregion


    //#region Public Interface

    return {
        skills: skills
    }

    //#endregion
};

这是HTML绑定:

代码语言:javascript
复制
<ul class="skills skills-top" id="skills" data-bind="foreach: skills">
    <li>
        <i data-bind="text: $index"> </i>
        <span data-bind="text: $data.Title"></span>
    </li>
</ul>
<script src="//cdn.horodyski.me/js/vm.js"></script>
<script>
    ko.applyBindings(eh.vm.skills, $("#skills")[0]);
</script>

我想做的是创建skills变量,获取数据并返回数据。数据已经返回到数组中(例如:[{Title: "ABC"}]),但它似乎没有绑定。我试着使用$.when().then() (正如我喜欢的那样),但是即使计算值被推迟,它仍然不会更新。

对我来说,真正复杂的部分是可变范围。当涉及到范围时,模块显示模式很糟糕。我已经绞尽脑汁了3 hours...if,任何人都可以引导我朝着正确的方向前进,我将不胜感激。

使用Knockout 3.1编辑(如果有帮助的话)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-04 00:13:53

您的read回调完全错误。

回调:

代码语言:javascript
复制
function (data) {
    return data;
}

是死代码,它将数据返回给调用此回调的jQuery函数,该函数将不会对其进行任何操作。

您需要返回延迟本身:

代码语言:javascript
复制
read: function () {
    return $.get("http://horodyski.me/api/skills");
}

这里还需要异步扩展程序:http://smellegantcode.wordpress.com/2012/12/10/asynchronous-computed-observables-in-knockout-js/

代码语言:javascript
复制
ko.extenders.async = function(computedDeferred, initialValue) {
    var plainObservable = ko.observable(initialValue), currentDeferred;
    plainObservable.inProgress = ko.observable(false);

    ko.computed(function() {
        if (currentDeferred) {
            currentDeferred.reject();
            currentDeferred = null;
        }

        var newDeferred = computedDeferred();
        if (newDeferred && (typeof newDeferred.done == "function")) {
            plainObservable.inProgress(true);
            currentDeferred = $.Deferred().done(function(data) {
                plainObservable.inProgress(false);
                plainObservable(data);
            });
            newDeferred.done(currentDeferred.resolve);
        } else {
            plainObservable(newDeferred);
        }
    });

    return plainObservable;
};

用于:

代码语言:javascript
复制
var skills = ko.computed(...).extend({ async: null });

如果您想在JSON传递到您的视图之前连接到它:

代码语言:javascript
复制
var skillsJson = ko.computed(...).extend({ async: null });
var skills = ko.computed(function () {
    return transformData(skillsJson());
};

或者:

代码语言:javascript
复制
var skills = ko.computed(function () {
        return $.get("url").then(function (data) {
            return transform(data);
        });
    });
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27283677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档