Employee.js (в папке js):

труктурировать несколько страниц с RequireJS? Является ли, как и в следующем примере, объявление каждого класса в app.js правильным решением? Имеет каждый HTML-файл, чтобы объявить<script data-main="src/main" src="src/require.js"></script>?

Чего я хочу избежать, так это загружать весь скрипт, когда пользователь попадает на первую страницу сайта.

main.js, определяющий все внешние зависимости:

require(
    {
        baseUrl:'/src'
    },
    [
        "require",
        "order!http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js",
        "order!http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js",
        "order!http://ajax.cdnjs.com/ajax/libs/underscore.js/1.1.6/underscore-min.js",
        "order!http://ajax.cdnjs.com/ajax/libs/backbone.js/0.3.3/backbone-min.js"
    ], 
    function (require) {
        require(["app"], function (app) {
            app.start();
        });
    }
);

Файл app.js, определяющий каждый компонент:

define([ "product/ProductSearchView",
         "product/ProductCollection"
         ], function (ProductSearchView,
                      ProductCollection) {
         return {
             start: function() {
                  var products = new ProductCollection();
                  var searchView = new ProductSearchView({ collection: products });
                  products.fetch();
                  return {};
             }
        }
});

Ответы на вопрос(2)

Это полный пример того, как все это работает;require.js а такжеorder.js находятся в том же каталоге, что и файлы JS приложения.

<html> 
  <head>  
    <script data-main="js/test" src="js/require.js"></script>
  </head> 
  <body> 
    <button>Clickme</button>
  </body> 
</html>

test.js (в папке js)

require(
  {
    baseUrl:'/js'
  },
  [
    "order!//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js",
    "order!//ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"
  ], 
  function () {
    require(["app"], function (app) {
      app.start();
    });
  }
);

app.js (в папке js) с загрузкой Employee.js по требованию:

define([], function () {
  return {
    start: function() {
      $('button').button();
      $('button').click(function() {
        require(['Employee'], function(Employee) {
          var john = new Employee('John', 'Smith');
          console.log(john);
          john.wep();
        });
      });

      return {};
    }
  }
});

Employee.js (в папке js):

define('Employee', function () {
  return function Employee(first, last) {
    this.first = first; 
    this.last = last;
    this.wep = function() {
        console.log('wee');
    }
  };
});
Решение Вопроса

когда кто-то нажимает на ссылку, вы можете вызвать функцию, которая выполняет следующие действия:

// If you have a require in your other module
// The other module will execute its own logic
require(["module/one"], function(One) {
    $("a").click(function() {
        require(["new/module"]);
    });
});

// If you have a define in your other module
// You will need to add the variable to the require
// so you can access its methods and properties
require(["module/one"], function(One) {
    $("a").click(function() {
        require(["new/module"], function(NewModule) {
            NewModule.doSomething();
        });
    });
});
 yves amsellem15 июн. 2011 г., 18:00
принято! Я предоставил ответ с рабочим образцом.
 yves amsellem09 июн. 2011 г., 10:34
Лиnew/module должен быть назван? Если это не так, как использовать, скажем, егоclean() метод?
 user60328410 июн. 2011 г., 19:42
Я обновил код, чтобы отразить оба случая. Принять?
 yves amsellem09 июн. 2011 г., 10:35
Ах, и естьrequire должен быть в другомrequire или может это появляется вdefine блок?
 user60328410 июн. 2011 г., 19:37
Вы можете назвать его, если хотите, в этом случае вы захотите создать определение в новом / модуле. В настоящее время я использую его без имени, потому что он будет работать по собственной логике.

Ваш ответ на вопрос