在持续生命周期回调中初始化第三方库
Inializing third-party library within durandal lifecycle callbacks
我需要初始化第三方库- videojs -每次视图模型激活。然而,问题是库需要一个dom元素,当durandal的激活回调被执行时,它还没有被附加。
//viewmodel
define (["jquery", "knockout", "videojs"], function ($, ko, videojs) {
var
activate = function (videoSource) { //route param
var videoTag = $('#video').get(0); //undefined
var playerInstance = new videojs.Player(videoTag); //error
playerInstance.src(videoSource); //loads video from route parameter
playerInstance.play(); //starts to play
};
return {
activate: activate
}
});
//view
<section id="page-quiz-answer" class="page">
<video id="video"></video>
</section>
DOM在#activate回调中还不可用。您需要在#attached或#compositionComplete回调中访问DOM元素。你可以在这里阅读这些回调函数的签名,以及它们的预期目的。
//viewmodel
define (["jquery", "knockout", "videojs"], function ($, ko, videojs) {
var attached = function (view) { //route param
var $view = $(view);
var $videoTag = $view.find('#video'); //undefined
var playerInstance = new videojs.Player($videoTag); //error
playerInstance.src(videoSource); //loads video from route parameter
playerInstance.play(); //starts to play
};
return {
attached: attached
}
});
另一种方法
您还可以编写一个自定义Knockout绑定,并封装访问DOM元素的逻辑。
我实际上会建议使用这种方法,因为我怀疑您将DOM引用传递给videojs.Player()
的点。这需要在自定义绑定中封装。
[编辑]
自定义绑定的使用示例
在视图中考虑这种用法:
<div id='video' data-bind=player: {instance: playerInstance, source: videoSource}></div>
有了这个,您就可以将上面#attached函数中的所有逻辑移动到自定义绑定中。如果你需要动态控制playerInstance,你可以在视图模型中创建一个带有可观察属性的对象字面值,类似如下:
var playerOptions = {
action: ko.observable('play'),
player: new videojs.Player(),
source: ko.observable(videoSource)
};
并将绑定更改为:
<div id='video' data-bind=player: {options: playerOptions}></div>
你的自定义绑定看起来像这样:
ko.bindingHandlers.player = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var options = ko.unwrap(valueAccessor),
$element = $(element);
var playerInstance = options.player;
playerInstance.source = options.source();
playerInstance.do(options.action());
}
};
我不确定你的播放器是如何连接到DOM的。我只能看到您传入了一个DOM元素。但是在这个绑定中,您可以访问元素本身。
相关文章:
- 使用javascript函数在页面初始化后加载jquery
- 未捕获错误:无法在初始化之前调用方法;
- 如何在剑道网格初始化后设置pageSizes
- React redux初始化功能,无论状态变化如何
- 为什么可以't Protractor在自动初始化的Angular网站上查找Angular
- 尝试初始化()Spine's控制器和故障
- Angular.js延迟控制器初始化
- 对插件初始化后动态加载的元素进行样式设置
- Angular JS控制器初始化错误
- 在XMLHttpRequest之后重新初始化jQuery
- ember-js组件初始化不同的函数
- Youtube JavaScript API不是't正在初始化
- 函数无法识别初始化的变量
- datepicker引导程序再次初始化
- jquery数据表在初始化时设置宽度
- 如何使用app和secret进行安全的解析初始化
- 从javascript中再次初始化c变量
- ng重复中的ng模型-初始化唯一作用域属性
- AngularJS服务初始化并获取第三方组件
- 在持续生命周期回调中初始化第三方库