knockoutjs绑定observablearray不起作用

时间:2013-07-23 16:18:56

标签: knockout.js

我试图通过“搜索”功能从youtube获取视频。我在一个observablearray中推送数据,但BINDING总是失败。

我有这样的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>

正如您所看到的,我将每个Feed的“标题”记录到控制台中,它运行正常,阵列已更新。但在我看来,我仍然无法看到提要的“标题”。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

而不是调用videoFeeds().push(videoFeed)尝试通过说vm.videoFeeds.push(videoFeed)来更新View Models属性目录。

创建视图模型时,您将首选项传递给videoFeeds数组,但是,一旦开始添加项目,您应该只使用View Models数组。

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

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

并一起摆脱初始数组定义。