如何从局部调用javascript对象

时间:2016-08-25 09:34:08

标签: angularjs soundmanager2

我有一个部分与以下片段

<div id="playDiv" ng-show="audioAvailable">
    <br/>
    <button play-pause-toggle data-play="Play" data-pause="Pause">Play</button>
    <button ng-click="soundManager.sounds[soundManager.soundIDs[0]].play()">Play</button>
</div>

我正在解决一个问题,即angular-soundmanager2库中的play-pause-toggle指令无法正常工作。它在我第一次加载页面时工作。如果我加载第二个声音,我有代码删除其他声音。 这会删除其他声音,但新声音不会播放。 如果我在控制台内的ng-click内运行代码,声音就会播放......在我从控制台播放声音后,播放 - 暂停 - 切换按钮再次起作用。

如何让ng-click指令调用soundManager.sounds [soundManager.soundIDs [0]]。play()?

这是清除旧声音的控制器代码。

angular.module('infosystem',['angularSoundManager']).controller("insightsDetailCtrl", function ($scope, $stateParams, $rootScope, $http, $sce) {

        var debug = true ;

        SC.initialize({
        client_id: "YOUR_SOUNDCLOUD_CLIENT_ID"
        });

        if ( !$rootScope.soundManagerObjects ) {
            $rootScope.soundManagerObjects = [] ;
        }

        function soundManagerIdCheck(id){
            var result = false ;
            if ( soundManager ) {
                var sound = soundManager.getSoundById(id) ;
                if ( sound ) {
                    result = true ;
                }
            }
            return result ;
        }

    function asyncLoop(o) {
        var i = -1;
        var loop = function() {
            i++;
            if(i == o.length) {
                              o.callback();
                return;
            }
            o.functionToLoop(loop, i);
        };
        loop(); //init
    }


        $scope.loading_insights = true;
    $scope.load_insight = function (insight_id) {
        $scope.loading_insights = true;
        $http({
            method: 'GET',
            url: $rootScope.serverURL + 'insights/' + insight_id,
            headers: {
                'Accept': 'application/json'
            }
        })
                .success(function (data) {
                    $scope.loading_insights = false;
                    data.description=$sce.trustAsHtml(data.description);
                    data.audio=$sce.trustAsHtml(data.audio);
                    $scope.insight = data;

                                        $rootScope.audioAvailable = false ;

                                        if ( data.soundcloud_track ) {

                                            SC.stream( '/tracks/' + data.soundcloud_track.id , function( sm_object ){

                                          var track = {
                                                    id: data.soundcloud_track.id,
                                                    title: data.soundcloud_track.title,
                                                    artist: data.soundcloud_track.artist,
                                            url: sm_object.url
                                          };

                                                $rootScope.audioAvailable = true ;
                                                $rootScope.smId = sm_object.id ;
                                            var smIdsLength = soundManager.soundIDs.length;

                                            asyncLoop({
                                                length: smIdsLength,
                                                functionToLoop: function(loop, i) {
                                                    setTimeout(function() {
                                                        //custom code
                                                                        var soundManagerId = soundManager.soundIDs[0] ;
                                                                        if ( soundManagerIdCheck(soundManagerId)){
                                                                            soundManager._wD('soundManager.stop(' + soundManagerId + ')', 1);
                                                                        }

                                                        if ( soundManagerId ) {
                                                                            if ( $rootScope.smId != soundManagerId) {
                                                                                soundManager.destroySound(soundManagerId);
                                                                            }
                                                                        }
                                                        //custom code
                                                        loop();
                                                    }, 100);
                                                },
                                    callback: function() {
                                        //callback custom code

                                        //callback custom code
                                    }
                                              }
                                            );




                                            }) ;                                        

                                        }
                })
                .error(function (error) {
                    $scope.loading_insights = false;
                })
    }
    $scope.load_insight($stateParams.insight_id);
})

2 个答案:

答案 0 :(得分:2)

将它放在一个将驻留在控制器范围内的函数中并尝试调用代码soundManager.sounds [soundManager.soundIDs [0]]。play()

希望这会有所帮助。

答案 1 :(得分:0)

我突然想到在$ scope中添加一个函数并调用它。

我将以下代码添加到控制器中。

    $scope.playFirstSoundManagerSound = function() {
        soundManager.sounds[soundManager.soundIDs[0]].play()
    }

并将部分更改为

<div id="playDiv" ng-show="audioAvailable">
    <br/>
    <button ng-click="playFirstSoundManagerSound()">Play</button>
</div>