我正在使用最新的opentok客户端API 2.18.0和Ember.js框架构建一个原型视频Web应用程序。
我有一个简单的Ember.js页面、控制器和css示例,它可以连接到Vonage视频API,但页面视频div DOM targetElement(“发布者”)没有被替换。
我看到的只是附加到HTML主体的新DOM元素中的已发布视频。
问题:为什么targetElement没有被替换?
将出版者targetElement变更为无效的名称不会掷回错误,而且行为完全相同。
发布者('发布者无效'
我的页面
{{global/site-header}}
{{#global/app-container}}
<div class="Container">
{{!-- TODO opentok is not putting video here? --}}
<div id="videos" class="VideoParticipant">
<div id="subscriber" class="VideoParticipant-subscriber"></div>
<div id="publisher" class="VideoParticipant-publisher"></div>
</div>
{{forms/buttons/button-action
class="Button--block"
text='START'
onClick=(action 'start')
}}
</div>
{{/global/app-container}}
我的控制器
import Ember from 'ember';
import OT from '@opentok/client';
const {
Controller,
Object: EmberObject,
} = Ember;
// TODO get session, token from server
const apiKey = "REMOVED";
const sessionId = "REMOVED";
const token = "REMOVED";
export default Controller.extend({
init() {
this._super(...arguments);
this.initializeSession();
},
initializeSession() {
var session = OT.initSession(apiKey, sessionId);
this.session = session;
// Subscribe to a newly created stream
session.on('streamCreated', function(event) {
session.subscribe(event.stream, 'subscriber', {
insertMode: 'replace'
}, function(error) {
if (error) {
console.log('There was an error subscribing: ', error.name, error.message);
return;
}
});
});
// Create a publisher
var publisher = OT.initPublisher('publisher', {
insertMode: 'replace'
}, function(error) {
if (error) {
console.log('There was an error initializing publisher: ', error.name, error.message);
return;
}
});
// Connect to the session
session.connect(token, function(error) {
// If the connection is successful, initialize a publisher and publish to the session
if (error) {
console.log('There was an error connecting to session: ', error.name, error.message);
} else {
session.publish(publisher, function(error) {
if (error) {
console.log('There was an error publishing: ', error.name, error.message);
}
});
console.log("INIT VIDEO SESSION PUBLISHED");
}
});
},
actions: {
start() {
console.log("TODO CH START");
},
cancel() {
this.send('no');
},
},
});
我的CSS
.VideoParticipant {
position: relative;
width: 100%;
height: 100%;
margin-left: auto;
margin-right: auto;
}
.VideoParticipant-subscriber {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 10;
}
.VideoParticipant-publisher {
position: relative;
width: 360px;
height: 240px;
margin-bottom: 10px;
margin-left: 10px;
z-index: 100;
border: 3px solid white;
border-radius: 3px;
}
1条答案
按热度按时间z4bn682m1#
当调用
OT.initPublisher
时,Ember可能还没有在模板中呈现HTML。要检查是否存在此问题,可以在
OT.initPublisher
行之前添加一个debugger
,然后检查DOM。如果这就是问题所在,您可以通过将代码调度到渲染完成后运行来解决此问题。您可以通过将控制器的
init
方法中对this.initializeSession
的调用替换为schedule('afterRender', this, this.initializeSession)
来实现此目的。使用import { schedule } from '@ember/runloop';
导入schedule
或者,如果您使用的是Ember的最新版本(3.12或更高版本),您可以考虑使用
{{did-insert ...}}
修饰符来调用初始化,而不是在runloop上调度它。