3

sammyjsをrequirejsで遊ばせるのに少し苦労しています。呼び出し$.sammyが失敗し、jQuery 名前空間で sammy が定義されていないというエラーが表示されます。

ここに私の必要な設定があります

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 に渡されるサミーが null ではない

sammy ファイルにブレークポイントを設定すると、ヒットして AMD モジュールであることが認識されます。jQuery名前空間に追加されない理由がわかりません。

最初にページが正しく読み込まれたことを再確認しましたが、domReady モジュールがそれを処理します。

私もコーヒースクリプトを使用していますが、それが問題になるとは思いません。

4

2 に答える 2

3

$.サミーを機能させるには、注入しているので表記を削除します

@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誰かがこれを並べ替える方法を知っている場合はお知らせください! knockout他の人がandkoと mapping プラグインを使ってこのようなことをしているのを見たことがありますko.mapping

于 2013-06-28T11:24:57.633 に答える
0

Sammy は、requirejs とうまく連携し、jquery モジュールをロードする必要があることをすでに認識しているはずです。

私はsammyjsが初めてなので、おそらく上記の答えは、サミーが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 に答える