钛合金 - ' Global'倾听者

时间:2017-11-21 19:53:07

标签: titanium appcelerator-titanium titanium-alloy appcelerator-alloy

我有多个窗口需要'实时栏,以便整个栏在所有窗口上持续存在。但是,每当“改变”时,函数被调用,它工作并记录,但我的$ .livebar_datalbl.text失败并出现以下错误:" undefined不是对象(评估' $。livebar_datalbl.text ='状态:& #39; + e.description +'(' + e.state +')'')"

我是否错误地构建了代码或丢失了某些内容?

index.js

(function constructor() {
    audioPlayer = Ti.Media.createAudioPlayer({
        url: 'https://allthingsaudio.wikispaces.com/file/view/Shuffle%20for%20K.M.mp3/139190697/Shuffle%20for%20K.M.mp3',
        allowBackground: true
    });

    audioPlayer.addEventListener('progress', function(e) {
        Ti.API.info('Time Played: ' + Math.round(e.progress) + ' milliseconds');
    });

    audioPlayer.addEventListener('change', function(e) {
        $.livebar_datalbl.text = 'State: ' + e.description + ' (' + e.state + ')';
        Ti.API.info('State: ' + e.description + ' (' + e.state + ')');
    });

    window = Alloy.createController('listen').getView();
    window.open();
})();

livebar.xml

<Alloy>
    <View class="livebar">
        <View class="livebar_livelblcontainer">
            <Label class="livebar_livelbl">LIVE</Label>
        </View>
        <Label class="livebar_datalbl" id="livebar_datalbl">HELLO WORLD</Label>
        <ImageView id="livebar_playpausebtn" class="livebar_playpausebtn"/>
    </View>
</Alloy>

livebar.js

$.livebar_playpausebtn.addEventListener('click', function(event) {
    if (audioPlayer.playing || audioPlayer.paused) {
        audioPlayer.stop();
        if (Ti.Platform.name === 'android')
        {
            audioPlayer.release();
        }
    } else {
        audioPlayer.start();
    }
});

audioPlayer.addEventListener('progress', function(e) {
    Ti.API.info('Time Played: ' + Math.round(e.progress) + ' milliseconds');
});

audioPlayer.addEventListener('change', function(e) {
    $.livebar_datalbl.text = 'State: ' + e.description + ' (' + e.state + ')';
    Ti.API.info('State: ' + e.description + ' (' + e.state + ')');
});

1 个答案:

答案 0 :(得分:1)

audioPlayer.addEventListener事件只会侦听您在其中创建audioPlayer的控制器中的事件,在本例中为 index.js 。在您的示例中, livebar.js 中的audioPlayer.addEventListener个事件无效,因为没有audioPlayer可以添加事件。

如果您希望在 index.js 中安装audioplayer,然后更新实时栏并仍然将实时栏保留在自己的视图+控制器中,则需要在控制器之间触发事件。为此,您可以使用Ti.App.fireEvent

您可以在此处阅读更多内容 - 搜索&#34;应用级别事件&#34; 部分

http://docs.appcelerator.com/platform/latest/#!/guide/Event_Handling

您可以执行以下操作。

请记住要小心使用App wide事件侦听器,您应该始终删除 当你通过下面的功能完成它们时

Ti.App.removeEventListener("eventlistenername", eventfunctionname);

<强> index.js

(function constructor() {
    audioPlayer = Ti.Media.createAudioPlayer({
        url: 'https://allthingsaudio.wikispaces.com/file/view/Shuffle%20for%20K.M.mp3/139190697/Shuffle%20for%20K.M.mp3',
        allowBackground: true
    });

    audioPlayer.addEventListener('progress', function(e) {
        Ti.API.info('Time Played: ' + Math.round(e.progress) + ' milliseconds');
    });

    audioPlayer.addEventListener('change', function(e) {

        // set livebareText
        var livebareText = 'State: ' + e.description + ' (' + e.state + ')';

        // fire app wide event
        Ti.App.fireEvent("app:updateLivebar",livebareText);

        Ti.API.info('State: ' + e.description + ' (' + e.state + ')');
    });

    window = Alloy.createController('listen').getView();
    window.open();
})();

<强> livebar.js

$.livebar_playpausebtn.addEventListener('click', function(event) {
    if (audioPlayer.playing || audioPlayer.paused) {
        audioPlayer.stop();
        if (Ti.Platform.name === 'android')
        {
            audioPlayer.release();
        }
    } else {
        audioPlayer.start();
    }
});

// Add App eventlistener to listen for updateSingleProgessBar
Ti.App.addEventListener("app:updateLivebar", updateLivebar);

function updateLivebar(livebarText){

    $.livebar_datalbl.text = livebarText;
    Ti.API.info('State: ' + e.description + ' (' + e.state + ')');

}