Durandal.js 单例未返回正确的实例

Durandal.js singleton not returning correct instance

我有一个名为 'player' 的模块,它控制我的应用程序的全局播放器。从另一个模块,我想知道玩家是否在玩什么。在播放器模块中,我有一个可观察到的 return 播放器的当前状态。我已经编写了两个函数来检查玩家是否以不同的方式玩游戏,但是从我的另一个视图模型来看,这两个函数总是 returns 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(),return就是我false。我确定播放器模块中的 属性 isPlaying()true,因为我点击了播放按钮,它变成了暂停按钮(我正在控制play/pause 全局播放器按钮 属性)。我尝试了很多方法来了解播放器是否暂停,但它们都 return 给我错误的值。我做错了什么?

我不知道这对你有用,但尝试将你的播放器模块更改为 return 像这样的单例:

片段代码示例:

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

要获取视图模型的正确实例,您需要要求它的模块 ID。所以你不需要在main.js中定义文件。我只需要 'viewmodels/player',它给了我正确的实例。