我有些麻烦让sammyjs和requirejs一起玩.调用$.sammy失败,并且错误表明jQuery名称空间中未定义sammy.
这是我的要求配置
require.config
baseUrl: '/Scripts'
waitSeconds: 10
paths:
bootstrap: './lib/bootstrap/bootstrap'
domReady: './lib/domReady/domReady'
knockout: './lib/knockout/knockout-2.2.1.debug'
jquery: './lib/jquery/jquery-1.9.1'
sammy: './lib/sammy/sammy-0.7.4'
myPage: './app/pages/myPage'
myViewModel: './app/viewModels/myViewModel'
shim:
bootstrap:
deps: ["jquery"]
sammy:
deps: ["jquery"]
exports: "Sammy"
这是我的页面javascript
require ['knockout', 'myViewModel', 'domReady!' ], ( ko, viewModel ) ->
myViewModel = new viewModel
ko.applyBindings( myViewModel )
这是我的视图模型
define [ 'jquery', 'sammy', 'knockout' ], ( $, sammy, ko ) ->
class myViewModel
constructor: ( options ) ->
self = @
@sammypath = ko.observable( 1 )
@router = $.sammy( ->
@get '#/', ( data ) ->
self.sammypath( 1 )
)
@router.run()
但是,当我尝试调用$.sammy时出现错误
Uncaught TypeError: Object function ( selector, context )
{ // The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery ); }
has no method 'sammy'
我猜这是require.config的错误,但是老实说我不确定.
可以很好地下载sammy-0.7.4.js文件.
传递给视图模型中的定义的sammy不为null
我在sammy文件上贴了一个断点,它被击中并意识到它是AMD模块.我只是不确定为什么它不将自身添加到jQuery名称空间中.
我再次检查了页面是否首先正确加载,但是domReady模块可以解决该问题.
我也在使用coffeescript,但是我认为那不是问题.
解决方法:
为了让公司工作起来很聪明,我只花了$.符号,因为我正在注入它
@router = sammy( ->
@get( '#/', ( data ) ->
self.sammypath( 1 )
)
)
我似乎无法让$.sammy正常工作. The RequireJs documentation关于如何使$.sammy正常工作有一些提示
var require = {
deps: ["some/module1", "my/module2", "a.js", "b.js"],
callback: function(module1, module2) {
//This function will be called when all the dependencies
//listed above in deps are loaded. Note that this
//function could be called before the page is loaded.
//This callback is optional.
}
};
看起来我可以使用回调来使它与类似的东西一起工作
var require = {
deps: ["jquery", "sammy"],
callback: ($, sammy) ->
$.sammy = sammy
}
但是,如果有人知道如何对它进行排序,我将无法与require.config配合使用!我已经看到其他人使用淘汰赛和ko以及映射插件ko.mapping做类似的事情