我确信“内在要求”不是正确的术语,但它很快就会在这里说得通。我正在研究工具包网站上的 Dijit 教程,我遇到了一个问题,我认为这更像是对 Javascript 的理解,而不是对 Dojo 的理解。
我的页面初始化脚本:
require(['player', 'dojo/dom', 'ready'], function(Player, dom){
var p = new Player({
type : 'video',
dimensions : [720, 480]
});
p.setSource('videos/myvideo.webm')
p.placeAt(dom.byId('stage') )
})
还有我的 dijit "player.js" 构造函数
constructor : function(opts){
(function($){
require(['sg/player/component/Video', 'sg/player/component/Audio'], function(Video, Audio){
$._setMedia( (opts.type == 'video') ? new Video() : new Audio());
console.log($._media) // outputs an object "a"
})
})(this);
console.log(this._media) // also outputs the correct object, "a"
}
// the internal setter function used above
_setMedia : function(m){
this._media = m;
},
(我有一个匿名函数的原因是我不喜欢var self = this
在require
块内分配,this
不是包含对象。)
当我new Player()
在 init 脚本中创建对象时,我可以看到其中一个Audio
或的一个新实例Video
被正确分配。但是,当我p.setSource()
在初始化脚本中调用时,我得到一个_media
空错误!
脚步
- 创建播放器
- 解析配置选项(类型、尺寸等)。内部
_media
对象持有Video
or的实例Audio
- 解析配置选项(类型、尺寸等)。内部
- 允许在
Player
源之外访问setter方法!!错误 !!
所以我的问题,希望我提供了足够的上下文,但是为什么_media
变量失去了它的价值?要从 Dijit 源外部访问的实例内部的任何方法Player
都不应该对内部变量的范围产生任何影响,但这似乎是正在发生的事情。构造函数返回后,_media
应该设置!但是使用
setSource : function(s){
console.log('Setting source: ', s, this._media)
// outputs ("Setting source: path/to/video.webm', null)
},
...引发错误,因为_media
它在内部引用的变量setSource
应该是空的。
希望这很清楚:)
更新
希望我能给你们两个复选标记!感谢您抽出宝贵时间提供帮助。
@Frode:肯定有一些异步问题迫使我学习并尝试更多的结构,所有这些都失败了,导致了这次更新。我认为在某些时候文件被缓存,导致变量内容不一致。
@phusick:我混合了您在下面发布的建议。
我考虑过重做 Player 实例化的结构、对象 arg 等,但决定执行以下操作,以防有人遇到这个问题......
我使用这种结构将Audio
和Video
类组合到_Media
文件中(为简洁起见,删除了代码)
define(['dojo/_base/declare'], function(declare){
var _base = declare("_Media", null, {
constructor : function(type){
this._type = type;
},
// etc
})
return {
Video : function(){
return declare("Video", _base, {
constructor : function(){
this.inherited(arguments, ['video'])
}
// etc
})()
},
Audio : function(){
return declare("Audio", _base, {
constructor : function(){
this.inherited(arguments, ['audio'])
}
// etc
})()
},
}
})
...这样一开始只加载一个文件,它包含两个子类。比在不使用一个文件时加载 2 个单独的文件要好,IMO。
对于播放器类型实例,它变为:
this._media = opts.type && opts.type == 'video' ? new Media.Video() : new Media.Audio();
到目前为止,一切都很好!再次感谢。