2015-06-03 53 views
0

我有一個名爲'player'的模塊,它控制着我的應用程序的全局播放器。從另一個模塊中,我想知道玩家是否在玩東西。在播放器模塊內部,我有一個可觀察的事件來返回播放器的當前狀態。我寫了兩個函數來檢查播放器是否以不同的方式播放,但兩者總是從我的另一個視圖模型返回false。Durandal.js單身人士不返回正確的實例

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.logself.playOtherPlayer(),它返回我false。我確信玩家模塊的屬性isPlaying()true,因爲我點擊了播放按鈕,並且它變成了暫停按鈕(我通過此屬性來控制全局玩家的播放/暫停按鈕的可見性) 。我嘗試了很多方法來知道玩家是否暫停,但他們都會給我返回錯誤的值。我究竟做錯了什麼?

+0

這句話讓我感到困惑:「我有一個叫'player'的模塊,它控制着我的app的全局播放器。」這個全局玩家是否在你的代碼中的其他地方實例化了?因爲,是的,你確定'var player = new Audio()'在你的模塊內引用同一個實例嗎? – Brett

+0

玩家視圖由shell.html組成。我並不擔心播放器變量,但我需要從其他模塊訪問播放器的觀察值 –

+0

您在哪裏更改observable isPlaying中的值?它看起來像你初始化它爲false然後輸出到控制檯日誌的值。你在哪裏設定它爲真?你有一個事件監聽器嗎? –

回答

0

爲了獲得正確的實例o f視圖模型,你需要要求它的模塊ID。所以你不需要在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

沒有幸運。 :( –