2015-06-03 4 views
0

У меня есть один модуль под названием «плеер», который управляет глобальным игроком моего приложения. Из другого модуля я хотел бы знать, играет ли игрок что-то. Внутри модуля плеера у меня есть наблюдаемое, которое возвращает текущий статус игрока. Я пишу обе функции, которые проверяют, проигрывает ли плеер по-разному, но оба всегда возвращают false из моей другой модели.Durandal.js singleton не возвращает правильный экземпляр

player.js

define(['knockout', 'durandal/app'], function(ko, app) { 
    .... 
    var player = new Audio(), 
     isPlaying = ko.observable(false), 
     songIsPlaying = function() { return !player.paused } 

    return { 
     isPlaying: isPlaying, 
     songIsPlaying: songIsPlaying 
    } 
}) 

home.js

define(['knockout', 'durandal/app', 'player'], function(ko, app, player) { 
    function vm() { 
     var self = this 
     ..... 
     self.playOtherPlayer = function() { 
     // this function plays another player, and I want to pause the global player if it's playing. 
     console.log("global player is playing?") 
     console.log(player.isPlaying()) 
     console.log(player.songIsPlaying()) 
     } 

    return vm 

    } 
}) 

В обоих console.log внутри self.playOtherPlayer(), он возвращает мне false. Я уверен, что свойство isPlaying() от модуля плеера true, потому что я нажал кнопку воспроизведения, и он изменился на кнопку паузы (я контролирую видимость кнопок воспроизведения/паузы глобального игрока по этому свойству) , Я пробовал так много способов узнать, приостановлен ли плеер, но все они возвращают мне неправильное значение. Что я делаю не так?

+0

Это заявление смущает меня: «У меня есть один модуль под названием« игрок », который управляет глобальным игроком моего приложения». Создан ли этот глобальный игрок где-то еще в вашем коде? Потому что, так, вы уверены, что 'var player = new Audio()' внутри вашего модуля ссылается на один и тот же экземпляр? – Brett

+0

Вид игрока составлен на shell.html. Я не очень беспокоюсь о переменной игрока, но мне нужно получить доступ к наблюдаемым данным игрока из других модулей. –

+0

Где вы меняете значение внутри наблюдаемого isPlaying? Похоже, вы инициализируете его как false, а затем выводите значение в консольный журнал. Где вы установили его как истину? У вас есть слушатель событий где-то? –

ответ

0

Для получения правильного экземпляра уплотнительных f viewmodel, вам нужно указать его moduleID. Поэтому вам не нужно определять файл в main.js. Я просто потребовал «viewmodels/player», и он дал мне правильный экземпляр.

0

Я не знаю, что это будет работать для вас, но попытаться изменить модуль проигрывателя для возврата синглтон так:

Отрывок пример кода:

define([], function() 
{ 
    var viewModel = function() 
    { 
     ...... 
    }; 

    return new viewModel(); 
}); 

Полный пример код в соответствии с вашего кода:

define(['knockout', 'durandal/app'], function(ko, app) { 
    var viewModel = function() 
    { 
     var self = this; 

     ...... 

     var player = new Audio(); 

     self.isPlaying = ko.observable(false); 

     self.songIsPlaying = function() { 
      return ! player.paused; 
     } 
    }; 

    return new viewModel();   
}); 
+0

Не повезло. :( –

Смежные вопросы