我有点麻烦让sammyjs玩requirejs。调用$.sammy
失败,错误显示sammy未在jQuery名称空间中定义。
这是我的require config
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
文件已正常下载。
传递给视图模型中的define的sammy不为null
我在sammy文件上遇到了一个断点,它被击中并认出它是一个AMD模块。我只是不确定为什么它不会将自己添加到jQuery名称空间。
我首先检查了页面是否已正确加载,但domReady模块负责处理。
我也在使用coffeescript,但我不认为这应该是一个问题。
答案 0 :(得分:3)
要让sammy工作,我只需删除$.
符号,因为我正在注入它
@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
来玩这个游戏。我见过其他人使用knockout
和ko
以及映射插件ko.mapping
答案 1 :(得分:0)
查看此链接是否有助于解决您的问题: https://groups.google.com/forum/#!topic/requirejs/Jg53etr5bBE
答案 2 :(得分:0)
Sammy应该很好地使用requirejs,并且已经知道它需要加载jquery模块。
我是sammyjs的新手,所以也许上面的答案是在sammy和amd兼容之前?
这是current sammyjs version的一个片段,显示它应该可以使用requirejs ...至少我没有遇到任何麻烦。
(function(factory){
// Support module loading scenarios
if (typeof define === 'function' && define.amd){
// AMD Anonymous Module
define(['jquery'], factory);
} else {
// No module loader (plain <script> tag) - put directly in global namespace
jQuery.sammy = window.Sammy = factory(jQuery);
}
})(function($){
以下是使用它的示例
define(["jquery", "../sammy-0.7.5.min"], function ($, Sammy) {
Sammy('#main', function() {
// define a 'get' route that will be triggered at '#/path'
this.get('#/path', function() {
// this context is a Sammy.EventContext
this.$element() // $('#main')
.html('A new route!');
});
}).run();
}