2

RequireJSを使い始めたばかりですが、依存関係を正しく表現していないようです。私はかなり単純な依存関係チェーンをマッピングしようとしています:

KnockoutJSに依存するにjquery-tmpl依存するjquery

使用しないようにしていますrequire-jquery。私のHTMLでは、これを行います。

<script data-main="scripts/main" src="scripts/require.js"></script>

私のmain.js

require(
  {
    baseUrl: 'scripts',
    paths: {
        jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min',
        jquerytmpl: "require-jquery-tmpl",
        knockout: "require-knockout"
    }
  },
  ["myApp"],
  function() {
        $(function() {
            console.log('main: triggered');
        });
  }
);

私のrequire-jquery-tmpl.js

define([
  "order!jquery",
  "order!http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.js"], 
  function() {
    console.log("init tmpl");
  }
);

私のrequire-knockout.js

define([
  "order!jquerytmpl",
  "order!./scripts/knockout-1.2.1.js"], 
  function() {
        console.log("init ko");
  }
);

そして最後にmyApp.js

define(["knockout"], function() {
    $(function() { ... }
}

私が見ているのは、knockout-1.2.1.jsがjquery-tmpl.jsの前にロードおよび評価されていることです。console.logsは、の前に発生することを示しているためinit tmplinit koRequireJSコールバックは正しい順序で発生しています。しかし、Knockoutにいくつかのデバッグログを追加したところ、それが発生する前に評価されていることがわかりましたinit tmpl

その結果、しようとするとko.applyBindings()、jQueryテンプレートが見つからないと文句を言います。面白いことに、コールバックにデフォルトのテンプレートエンジンを登録するように手動でKOに指示すると、正常に動作し、すべてが完璧になります。しかし、それは核心的な問題を覆い隠しているだけだと思います。

Knockoutを評価する前にjquery-tmplがロードされるまでRequireJSが待機しないのはなぜですか?

4

2 に答える 2

3

実際の問題を診断することはできませんでしたが、モジュール定義の一部ではrequireなくを使用して依存関係を機能させることができました。define私のために働く構成は次のようになります:

私のmain.js

require(
  {
    baseUrl: 'scripts',
    paths: {
        jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min',
        jquerytmpl: "require-jquery-tmpl",
        knockout: "require-knockout"
    }
  },
  ["myApp"],
  function() {
        $(function() {
            console.log('main: triggered');
        });
  }
);

私のrequire-jquery-tmpl.js

define(["jquery"], function() {
    require(["order!http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.js"], function() {
        console.log("init tmpl");
    });
});

依存関係にリストする代わりに、requirejquery.tmpl.jsと言っていることに注意してください。orderdefine

同じ変更require-knockout.js

define(["jquerytmpl"], function() {
    require(["order!knockout-1.2.1.js"], function() {
        console.log("init ko");
    });
});

これで問題は解決RequreJs orderしましたが、プラグインが元の定義で正しく機能しない理由についてはまだ説明がありません。

于 2011-10-29T07:02:48.860 に答える
0

ディレクトリにorder.jsファイルがありますscriptsか?

また、requirejsサイトでは、jqueryも含める場合は、require.jsの代わりにrequire-jquery.jsを使用することをお勧めします私はいつも問題なくそれを使用してきました。

于 2011-10-27T17:55:04.367 に答える