我正在一起测试crossroads.js和hasher.js,并在第二个setHash调用中测试了以下代码错误,并带有“ Function.prototype.apply:参数不是对象”。这在IE和Chrome中都一样。
crossroads.addRoute( 'lorem/{id}', function( id ) { alert( id ); } );
hasher.changed.add( crossroads.parse, crossroads );
hasher.init();
hasher.setHash('lorem/123'); // works with alert(123)
hasher.setHash('lorem/456'); // javascript error
我在这里做错什么了吗?第一个setHash显示警报正常。
最佳答案
我解决了问题所在。 crossroads.parse
的hasher.changed
信号签名(请求,defaultArgs)错误,因此不应直接使用以下代码添加:hasher.changed.add(crossroads.parse, crossroads)
。如果我传入具有签名的代理方法(newHash,oldHash),则该方法有效:
crossroads.addRoute( 'lorem/{id}', function( id ) { alert( id ); } );
var proxy = function( newHash, oldHash ) { crossroads.parse( newHash ); };
hasher.changed.add( proxy ); // Use to be hasher.changed.add( crossroads.parse, crossroads );
hasher.init();
hasher.setHash('lorem/123');
hasher.setHash('lorem/456');
它第一次起作用的原因是因为没有
oldHash
,所以也没有defaultArgs
。如果defaultArgs
为空,则在parse
方法的开头将其初始化为一个空数组。但这工作得有点好,因为现在我每个
setHash
调用都会收到两个警报。