2013-06-27 49 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(); 

} 
的一個例子