Durandal需要来自shell的viewmodel

时间:2015-08-04 17:23:57

标签: javascript durandal durandal-2.0

在我的应用程序中,我有一个全球玩家。在shell模块中,我需要播放器的viewmodel,因为我想知道播放器是否正在播放,如果是,我将一个类添加到app的容器中(在shell中)。

问题在于我还需要从播放器VM中获取shell,因为我在应用程序中使用了一些shell中的函数。

但是当从shell中要求播放器模块时,要求播放器中的shell返回undefined。如果我不需要播放器,则shell会正常通过。

shell.js

define(['viewmodels/player'], function(player) {
 return {
  player: player
 }
})

player.js

define(['viewmodels/shell'], function(shell) {
 console.log('shell:', shell) // undefined
})

我不知道发生了什么。

2 个答案:

答案 0 :(得分:0)

嗯! 我想我曾经遇到过这个问题。它们发生的方式是需要检查shell需要什么。然后它看到播放器模块并去修复它,在里面你需要shell。循环参考。我们确实解决了它。

我们确实喜欢这样,我正在编写伪代码,但你应该可以试试这个。

有很多方法,这是一种简单的方法。打开你的播放器并做这样的事。

 var shell = require('shell'); //using this style to work around circular reference

答案 1 :(得分:0)

我会尝试帮助一些实施方案!<​​/ p>

1°!播放器可以是服务(单件),并且在bouth视图模式中是必需的,

// app/services/player.js
require([], function(){/*Player*/});

// shell
require(['services/player'], function(player){/* SHEll */});

// ohter view
require(['services/player'], function(player){/* other view*/});

2º您可以使用发布/订阅模式!杜兰达尔对此有所支持!

// Alert that play has been clicked
app.trigger('player:play');

// subscribe play
app.on('player:play', doSomething);

// deactivate subscription
app.off('player:play', doSomething);

检查documentation!

展位工作很好,低耦合......