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