Javascript Durandal.js singleton未返回正确的实例

Javascript Durandal.js singleton未返回正确的实例,javascript,durandal,Javascript,Durandal,我有一个名为“播放器”的模块,它控制我的应用程序的全局播放器。从另一个模块,我想知道玩家是否在玩什么。在player模块中,我有一个observable返回播放器的当前状态。我编写了两个函数来检查播放器是否以不同的方式播放,但这两个函数总是从另一个viewmodel返回false player.js define(['knockout', 'durandal/app'], function(ko, app) { .... var player = new Audio(),

我有一个名为“播放器”的模块,它控制我的应用程序的全局播放器。从另一个模块,我想知道玩家是否在玩什么。在player模块中,我有一个observable返回播放器的当前状态。我编写了两个函数来检查播放器是否以不同的方式播放,但这两个函数总是从另一个viewmodel返回false

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
。我确信播放器模块中的属性
isplay()
true
,因为我单击了播放按钮,它变为暂停按钮(我通过此属性控制全局播放器的播放/暂停按钮的可见性)。我尝试了很多方法来知道播放器是否暂停,但它们都返回了错误的值。我做错了什么?

我不知道这是否适用于您,但请尝试更改您的播放器模块以返回如下所示的单例:

代码片段示例:

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();        
});

为了获得viewmodel的正确实例,需要它的moduleID。因此,不需要在main.js中定义文件。我只需要“viewmodels/player”,它给了我正确的实例。

这句话让我困惑:“我有一个名为“player”的模块,它控制我的应用程序的全局播放器。”这个全局播放器是在代码中的其他地方实例化的吗?因为是这样,您确定模块中的
var player=new Audio()
引用的是同一个实例吗?player视图由shell.html组成。我并不真的担心玩家变量,但我需要从其他模块访问玩家的可观察值。在可观察显示中,您在哪里更改值?看起来您将其初始化为false,然后将该值输出到控制台日志。你在哪里设定它为真?你有一个事件监听器吗?我有一个叫做“播放”的函数,它可以设置isplay(true)。我用这个可观察的对象控制视图中播放/暂停按钮的可见性,它可以工作。当然,在单击play之后,我已经检查了isplay()的值。