Knockout.js knockoutjs bindind observablearray不起作用

Knockout.js knockoutjs bindind observablearray不起作用,knockout.js,Knockout.js,我试图通过“搜索”功能从youtube获取视频源。我以可观察的方式推送数据,但绑定总是失败 我的viewModel如下所示: var videoFeeds = ko.observableArray(); var vm = { videoFeeds: videoFeeds, search: search }; function search(value) { value = value.toLowerCase().replace(/\s+/g, '+'); var

我试图通过“搜索”功能从youtube获取视频源。我以可观察的方式推送数据,但绑定总是失败

我的viewModel如下所示:

var videoFeeds = ko.observableArray();
var vm = {
    videoFeeds: videoFeeds,
    search: search
};
function search(value) {
    value = value.toLowerCase().replace(/\s+/g, '+');

    var options = {
        url: 'https://gdata.youtube.com/feeds/api/videos/?q=' + value + '&max-results=10&alt=json&v=2',
        method: 'GET',
        dataType: 'jsonp'
    };

    $.ajax(options)
        .done(function (data) {
            videoFeeds([]);
            for (var k in data.feed.entry)
            {
                var videoFeed = {
                    title : data.feed.entry[k].media$group.media$title.$t,
                    id : data.feed.entry[k].media$group.yt$videoid.$t,
                    author: data.feed.entry[k].author[0].name.$t
                };

                videoFeeds().push(videoFeed);
            }
            for (var k in videoFeeds())
            {
                console.log('title : ' + videoFeeds()[k].title);
            }
        })
        .fail(function (err) {
            console.log(err);
        });
}
<ul data-bind="foreach: videoFeeds">
    <li data-bind="text: title"></li>
</ul>
视图如下所示:

var videoFeeds = ko.observableArray();
var vm = {
    videoFeeds: videoFeeds,
    search: search
};
function search(value) {
    value = value.toLowerCase().replace(/\s+/g, '+');

    var options = {
        url: 'https://gdata.youtube.com/feeds/api/videos/?q=' + value + '&max-results=10&alt=json&v=2',
        method: 'GET',
        dataType: 'jsonp'
    };

    $.ajax(options)
        .done(function (data) {
            videoFeeds([]);
            for (var k in data.feed.entry)
            {
                var videoFeed = {
                    title : data.feed.entry[k].media$group.media$title.$t,
                    id : data.feed.entry[k].media$group.yt$videoid.$t,
                    author: data.feed.entry[k].author[0].name.$t
                };

                videoFeeds().push(videoFeed);
            }
            for (var k in videoFeeds())
            {
                console.log('title : ' + videoFeeds()[k].title);
            }
        })
        .fail(function (err) {
            console.log(err);
        });
}
<ul data-bind="foreach: videoFeeds">
    <li data-bind="text: title"></li>
</ul>
正如您所见,我将每个提要的“title”记录到控制台中,它工作正常,数组已更新。但在我看来,我仍然看不到提要的“标题”


谢谢您的帮助。

不要调用
videoFeeds().push(videoFeed)
尝试更新视图模型属性目录,方法是说
vm.videoFeeds.push(videoFeed)

创建视图模型时,您正在向
videoFeeds
数组传递一个首选项,但是,一旦开始添加项,您应该只使用视图模型数组

为了便于阅读,最好像这样声明ViewModel:

var vm = {
    videoFeeds: ko.observableArray(),
    search: search
};

并一起去掉初始数组定义

你是对的
videoFeed()。推送(videoFeed)
是问题所在,非常感谢你的帮助。关于可读性,我同意你的看法,这可能是最好的方法。不客气。如果这解决了你的问题,也请标记为答案。谢谢