3

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

这是我的要求配置

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 不为空

我在 sammy 文件上设置了一个断点,它被击中并识别出它是一个 AMD 模块。我只是不确定为什么它不将自己添加到 jQuery 命名空间中。

我首先仔细检查了页面是否正确加载,但 domReady 模块负责处理。

我也在使用咖啡脚本,但我认为这不应该是一个问题。

4

2 回答 2

3

为了让 sammy 工作,我只是放弃了$.符号,因为我正在注入它

@router = sammy( -> 
  @get( '#/', ( data ) ->
    self.sammypath( 1 )
  )
)

不幸的是,我似乎无法$.sammy上班。 RequireJs 文档 有一些关于如何开始$.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,如果有人知道如何排序,请告诉我!我见过其他人用knockoutandko和映射插件做这样的事情ko.mapping

于 2013-06-28T11:24:57.633 回答
0

Sammy 应该可以很好地使用 requirejs 并且已经知道它需要加载 jquery 模块。

我是 sammyjs 的新手,所以也许上面的答案是在 sammy 兼容 AMD 之前?

这是当前 sammyjs 版本的片段,这表明它应该可以使用 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();

}
于 2014-03-26T14:34:21.823 回答