【问题标题】:Failing to push to Knockout observable array无法推送到 Knockout 可观察数组
【发布时间】:2014-04-13 22:05:06
【问题描述】:

我正在尝试将一些数据推送到 KO 可观察数组。我从我的 AJAX 调用中获取数据,并且在我的脚本执行时我没有收到任何错误。但是,如果我尝试访问 userNames,我会得到一个空数组。我在这里错过了什么?

UserHandler = (function () {
    var userName = function (data) {
            this.Name = data;
        };

    var userNames = ko.observableArray([]);

    var getUserNames = function () {
            userNames([]);
            $.ajax({
                url: "Users/All",
                dataType: "json",
                success: function (data) {
                    ko.utils.arrayPushAll(userNames, $.map(data, function (entry) {
                        return new userName(entry);
                    }));
                }
            });
        };;

    return {
        UserNames: userNames,
        GetUserNames: getUserNames,
    };

});

console.log(UserHandler().UserNames());
   --> []

【问题讨论】:

  • 如果你只执行这部分代码会发生什么 - $.map(data, function (entry) { return new userName(entry);
  • 我最终得到了一个 userName 对象数组。我可以循环浏览它们并返回对象的属性。我可能在范围上做错了吗?

标签: javascript arrays knockout.js javascript-objects


【解决方案1】:

淘汰赛中的可观察数组很棘手,有时难以理解。我可以这样做:

ko.utils.arrayPushAll(userNames(), $.map(data, function (entry) {
    return new userName(entry);
}));
userNames.valueHasMutated();

或者只是

userNames($.map(data, function (entry) {
    return new userName(entry);
}));

在第一个解决方案中,您添加括号以获取可观察的原始值,然后您对其进行操作并通知所有订阅者该值已更改。 在第二种解决方案中,您只需提供 observableArray 的新值。

【讨论】:

  • 由于某种原因它仍然无法正常工作。如果我将console.log(userNames()) 添加到 AJAX 成功函数中,我将获得所有用户。这适用于两种方法。但是如果我在对象之外尝试console.log(UserHandler().UserNames()),我会得到空值。
  • 每次调用 UserHandler() 时都会收到新对象。因此,请将其分配给某个变量,调用 GetUserNames() 等待结果,然后您的 UserNames 将具有值。
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多