2013-06-27 47 views
3

我有一点麻烦让sammyjs玩requirejs。调用$.sammy失败,错误表示sammy未在jQuery名称空间中定义。与RequireJs一起使用SammyJs

这是我需要的配置

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文件已下载正常。

萨米是通过传递到视图模型的定义不为空

我贴在萨米文件中的断点,它被击中,并认识到这是一个AMD模块。我只是不确定为什么它不会自己添加到jQuery名称空间。

我再次检查页面是否正确加载,但domReady模块负责。

我也在使用coffeescript,但我不认为这应该是一个问题。

回答

3

为了让萨米工作,我刚落$.符号,因为我将其注入

@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,如果有人知道如何排序这让我知道!我见过其他人用knockoutkoko以及映射插件ko.mapping

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(); 

} 
的一个例子