使用带有RequireJs的SammyJs

时间:2013-06-27 16:11:02

标签: javascript coffeescript requirejs amd sammy.js

我有点麻烦让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,但我不认为这应该是一个问题。

3 个答案:

答案 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来玩这个游戏。我见过其他人使用knockoutko以及映射插件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();

}