关于knockoutjs 的自定义 bindings
发布于 13 年前 作者 guang384 5560 次浏览 最后一次编辑是 8 年前

需求: 自定义bindings,使其可调用swfobject更新正在播放的flash的值

查看knockoutjs的官方可进行自定义扩展 文档位置

于是尝试:

(function(){  
ko.bindingHandlers['flash'] = {  
	'update': function(element, valueAccessor) {  
		var value = ko.utils.unwrapObservable(valueAccessor());  
		swfobject.embedSWF(value, element.id, "200", "120", "9.0.0");  
	}  
};  
})();  

jade代码如下:

div#aa(data-bind='flash : swfurl')  

js代码:

var viewModel = {  
	swfurl: ko.observable("/flashs/1.swf")  
};  
ko.applyBindings(viewModel);  

但是除了第一次赋值以外,当swfurl值改变时 (如调用如下方法时)并不会触发’update’的逻辑

function gos1(){  
	viewModel.swfurl('/flashs/1.swf');  
}  

求救

2 回复

问题解决了。。分享下吧。。。 内啥 表吐槽我的英文水平就好。。 http://groups.google.com/group/knockoutjs/browse_thread/thread/33a88399bb993c3b

伟大的墙。。我把代码捞回来了 大致原因是 swfobject会重新创建一个对象覆盖原先的对象 导致更新时间无法被调用。解决方案是,在内部新建一个div然后用swfobject去更新丫的。。

(function(){
var id = 0;
ko.bindingHandlers['flash'] = {
    'update': function(element, valueAccessor) {
        var swfid = element.id + "-swf";
        if( !document.getElementById(swfid) ) {
            var d = document.createElement('div');
            d.id = swfid;
            element.appendChild(d);
        }
        var value = ko.utils.unwrapObservable(valueAccessor());
        swfobject.embedSWF(value, swfid, "550", "400", "9.0.0");
    }
 };})();
回到顶部