【问题标题】:Knockout observableArray not updating淘汰 observableArray 不更新
【发布时间】:2013-04-18 03:17:37
【问题描述】:

我有一个不会在 HTML 中更新的 observableArray,即使我可以将它记录到控制台并看到它的变化。我希望 jsfiddle 有一个控制台,这样我就可以展示那部分了。

在我发布的示例中,我有一个人员列表,然后我搜索该列表并尝试将结果添加到新的 observableArray。搜索结果 observableArray 永远不会在 HTML 中更新。

这是我的 Jsfiddle:http://jsfiddle.net/hMmgV/1/

这是我的代码:

function AppViewModel() {
    var self = this;

    self.people = ko.observableArray([{
        fName: "Thomas",
        lName: "Edison"
    }, {
        fName: "Sally",
        lName: "Salputrio"
    }, {
        fName: "Edward",
        lName: "Sparkleshine"
    }, {
        fName: "Jacob",
        lName: "Wolfsson"
    }]);
    self.searchResult = ko.observableArray([]);
    self.searchFieldKo = ko.observable("");

    self.submitSearch = function () {
        if (self.searchFieldKo() != "") {
            self.searchResult().length = 0;
            $.each(self.people(), function (pKey, pObj) {
                $.each(pObj, function (pProp, pValue) {
                    if (pValue.toString().toLowerCase().indexOf(self.searchFieldKo().toLowerCase()) >= 0) {
                        self.searchResult().push(self.people()[pKey]);
                        console.log(self.searchResult());
                    }
                })
            })
        } else {
            alert("Please type something.");
        }
    }
}

ko.applyBindings(new AppViewModel());

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    你有一组不必要的括号

    self.searchResult().push(self.people()[pKey]); 
    

    应该是

    self.searchResult.push(self.people()[pKey]);
    

    演示JSFiddle.

    因为当您编写 self.searchResult() 时,您正在访问 observable 中的底层数组。当你推入该数组时,KO 不会收到有关更改的通知,因此你需要在 observableArray 本身上使用 push 方法。

    顺便说一句,Knockout 有一组很棒的useful array helpers,可以简化您的过滤逻辑。

    【讨论】:

    • 有无耻检查正确答案标记的选项吗?
    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2013-11-27
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多