「内部要件」は正しい用語ではないと確信していますが、ここではすぐに意味があります。ツールキットのサイトからDijitチュートリアルに取り組んでいますが、DojoよりもJavascriptを理解していると思われる問題が発生しています。
マイページ初期化スクリプト:
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
initスクリプトでオブジェクトを作成すると、またはの新しいインスタンスが正しく割り当てられているnew Player()
ことがわかります。ただし、initスクリプトでinを呼び出すと、 nullのエラーが発生します。Audio
Video
p.setSource()
_media
手順
- プレーヤーの作成
- 構成オプション(タイプ、寸法など)を解析します。内部オブジェクトは、または
_media
のインスタンスを保持しますVideo
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
がおそらくnullであるため、エラーがスローされます。
それが明確であることを願っています:)
アップデート
両方のチェックマークを付けられたらいいのにと思います。お手数をおかけしますが、よろしくお願いいたします。
@Frode:確かにいくつかの非同期の問題があり、構造を学習してさらに試す必要がありましたが、すべて失敗し、この更新につながりました。ある時点でファイルがキャッシュされ、変数の内容に一貫性がなくなったと思います。
@phusick:以下に投稿されているあなたの提案をハイブリッド化しました。
Playerのインスタンス化方法やオブジェクト引数などの構造をやり直すことを考えましたが、誰かがこの問題にぶつかった場合に備えて、次のことを行うことにしました...
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
})()
},
}
})
...そうすれば、最初にロードされるファイルは1つだけで、両方のサブクラスが含まれます。1つが使用されないときに2つの別々のファイルをロードするよりも優れています、IMO。
プレーヤータイプのインスタンスの場合、次のようになります。
this._media = opts.type && opts.type == 'video' ? new Media.Video() : new Media.Audio();
ここまでは順調ですね!再度、感謝します。