javascript - knockout 音频播放列表

标签 javascript jquery knockout.js knockout-2.0

我正在创建一个基于音乐的应用程序,它使用 Knockout 进行绑定(bind)。应用程序中列出的所有轨道都是从 Soundcloud 外部提取的,如下所示:

$.getJSON('http://api.soundcloud.com/users/guy-j/tracks.json?client_id=c4bc3b1a93902abecbaca3fa4582d970', {limit: 200}, function(data) {
            vm.tracks($.map(data, function (track) {
                return {
                    artwork: track.artwork_url,
                    avatar: track.user.avatar_url,
                    date: track.created_at,
                    description: track.description,
                    duration: track.duration,
                    listens: track.playback_count,
                    permalink: track.permalink_url,
                    purhcase: track.purchase_url,
                    stream: track.stream_url,
                    track: track.title
                };
            }));
        });

这些轨道(一旦获取)会被推送到一个空白的 observableArray 中,然后 HTML View 会绑定(bind)到该数组并生成轨道列表。我的音频播放/暂停如下所示:

要选择/播放轨道,每个 <li>从 observableArray 生成的文件有一个名为“goToTrack”的点击处理程序,然后将一个名为“self.chosenTrackData”的可观察对象传递给选定的轨道,然后我的音频元素与“chosenTrackData”绑定(bind)以播放选定的轨道。

我现在的问题在于,我不太确定使用 Knockout 处理下一个/上一个轨道功能的最佳方法是什么。我必须了解如何区分 observableArray 中的当前点,然后++ 或 -- 取决于您选择的选项?

任何帮助将不胜感激,因为我仍在学习 knockout !

最佳答案

我建议保留一个内部“当前轨道”编号,您可以递增或递减该编号,并以此为基础进行计算。

function PlayerViewModel() {
    var self = this,
        currentTrackNo = ko.observable(0);

    // data
    self.tracks = ko.observableArray();

    // computeds
    self.currentTrack = ko.computed(function () {
        return self.tracks()[currentTrackNo()];
    });
    self.hasTrack = function (track) {
        return !!self.currentTrack();
    };
    self.hasNextTrack = ko.computed(function () {
        return currentTrackNo() < self.tracks().length - 1;
    });
    self.hasPrevTrack = ko.computed(function () {
        return currentTrackNo() > 0;
    });

    // API
    self.setNextTrack = function () {
        if (self.hasNextTrack()) {
            currentTrackNo(currentTrackNo() + 1);
        }
    };
    self.setPrevTrack = function () {
        if (self.hasPrevTrack()) {
            currentTrackNo(currentTrackNo() - 1);
        }
    };
    self.setTrack = function (track) {
        var trackNo = ko.utils.arrayIndexOf(self.tracks(), track);
        currentTrackNo(trackNo);
    };

    // init
    $.getJSON('...', {limit: 200}); etc;
}

将“当前轨道” View 组件绑定(bind)到 currentTrack 可观察对象。确保以某种方式使用 hasTrack(因为 currentTrack 可能未定义)。

<小时/>

替代实现,避免维护单独的轨道号:

function PlayerViewModel() {
    var self = this;

    // data
    self.tracks = ko.observableArray();
    self.currentTrack = ko.observable();

    // computeds
    self.currentTrackNo = ko.computed(function () {
        var currentTrack = self.currentTrack();
        return ko.utils.arrayIndexOf(self.tracks(), currentTrack);
    });
    self.hasTrack = function (track) {
        return !!self.currentTrack();
    };
    self.hasNextTrack = ko.computed(function () {
        return self.currentTrackNo() < self.tracks().length - 1;
    });
    self.hasPrevTrack = ko.computed(function () {
        return self.currentTrackNo() > 0;
    });

    // API
    self.setNextTrack = function () {
        if (self.hasNextTrack()) {
            self.currentTrack(self.tracks()[self.currentTrackNo() + 1]);
        }
    };
    self.setPrevTrack = function () {
        if (self.hasPrevTrack()) {
            self.currentTrack(self.tracks()[self.currentTrackNo() - 1]);
        }
    };
    self.setTrack = function (track) {
        // make sure that track is actually in self.tracks here
        self.currentTrack(track);
    };

    // init
    $.getJSON('...', {limit: 200}); etc;
}

关于javascript - knockout 音频播放列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23468497/

相关文章:

javascript - 需要将服务/工厂存储为值

javascript - 在 NestJS 中,有没有办法将数据从 Guards 传递到 Controller ?

javascript - 如何使用 jsdoc-toolkit 记录 jQuery-ui 小部件?

javascript - 如何正确使用KnockoutJS可见绑定(bind)?

javascript - Knockout 将可观察和计算的数据推送到可观察数组

javascript - 使参数的更改在函数外部可见(反射(reflect))

javascript - 有没有办法计算一个文件夹中有多少个文件,然后将其导入到变量中?

javascript - 如何使用 javascript 使用正则表达式 + 和 - ?

javascript - 如何在函数范围内将一个 div 附加到另一个具有特定 id 的 div

Javascript String.fromCharCode 返回错误值