1

私はしばらくこれを見つめていましたが、依存関係としてロードした後に一部のAMDが使用できない理由を理解できないようです。「モデル」と呼ばれるカスタムモジュールがあります。仮想パス「/scripts/models.js」を使用してMVCプロジェクトで構成されたバンドル。require.configで依存関係として定義すると、ファイルが読み込まれます。リクエストされて見つかったことがわかります。requireからのエラーはありません。ただし、ロードされた依存関係引数がルーターに渡されたときに参照しようとすると、未定義(models.userModel)になります。

ここで私が間違っていることはありますか?循環依存関係が見当たらないので、モデルモジュールに名前を付けて定義してみました。グローバルに定義するか、router.jsファイルのパスでモジュールをリクエストするかに関係なく、未定義です。

app.js。メイン設定 (下)

require.config({
    baseUrl: "/scripts/app",
    paths: {
        jquery: "../jquery",
        underscore: "libs/underscore",
        backbone: "libs/backbone",
        kendo: "libs/kendo",
        models: "../models"
    },
    // We shim Backbone since it doesn't declare an AMD module
    shim: {
        underscore: {
            exports: "_"
        },
        backbone: {
            deps: ["underscore", "jquery"],
            exports: "Backbone"
        }
    },
});

require([
    "jquery",
    "backbone",
    "kendo",
    "models",
    "router"
], function ($, backbone, kendo, models, router) {  
    alert("config-start");
});

user.js。models.jsバンドルに含まれています。(下)

define({
    userModel : kendo.observable({
        datasource: kendo.data.DataSource({
            transport: {
                read: {
                    url: "/api/usersettings",
                    dataType: "json",
                    type: "GET"
                },
                update: {
                    url: "/api/usersettings",
                    dataType: "json",
                    type: "PUT"
                }
            },
            schema: {
                model: {
                    id: "UserId"
                }
            },
            parameterMap: function (options, operation) {
                if (operation !== "read" && options.models) {
                    return {
                        models: kendo.stringify(options.models)
                    };
                }
                return options;
            }
        }),
        save: function () {
            this.data.sync();
        },
    })
});

router.jsファイル(以下)

define(["jquery",
    "backbone",
    "models"
], function ($, backbone, models) {

    /**
     * The Router class contains all the routes within the application -
     * i.e. URLs and the actions that will be taken as a result.
     *
     * @type {Router}
     */

    var Router = Backbone.Router.extend({
        contentArea: $("#MainContent"),
        routes: {
            "user/usersettings/contact": "contact",
            "user/usersettings/security": "security",
            "user/usersettings/dashboard": "dashboard",
            "user/usersettings/permissions": "permissions",
            "user/usersettings/colors": "colors"
        },
        contact: function () {
            var contactTemplate = kendo.template($("#usersettings-usercontact").html());
            this.contentArea.empty();
            this.contentArea.html(contactTemplate);

            kendo.bind(this.contentArea, models.userModel); // models is undefined
        },
        security: function () {

        },
        dashboard: function () {

        },
        permissions: function () {

        },
        colors: function () {

        }
    });

    // Create a router instance
    var router = new Router();

    //Begin routing
    Backbone.history.start();

    return router;
});

明らかな何かが欠けているかもしれませんが、外部依存関係として「モデル」をロードできませんでした。router.jsから参照する場合は未定義です。「連絡」機能について。

4

1 に答える 1

1

定義には値を返す関数が必要です。この値は、別のモジュールで必要になったときに挿入されます。

ソースコードコメント:

/**
 * The function that handles definitions of modules. Differs from
 * require() in that a string for the module should be the first argument,
 * and the function to execute after dependencies are loaded should
 * return a value to define the module corresponding to the first argument's
 * name.
 */
define(function(){
  return {
    userModel: ...
  }
})
于 2013-01-22T08:26:18.527 に答える