我正在一起测试crossroads.jshasher.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.parsehasher.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调用都会收到两个警报。

10-06 15:25