Я изучаю RequireJS, в процессе я застрял с проблемой ниже:
Я пытаюсь реализовать одностраничное приложение. Ниже приведенный сценарий аналогичен реальной проблеме.
Index.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
<script src="/require.js" data-main="main.js"></script>
</head>
<body>
<button id="start">Start</button>
<div id="buttonContainer"></div>
</body>
</html>
main.js
require([ 'jquery' ], function( $) {
$(function() {
$("#start").click(function() {
$("#buttonContainer").load("page1.html");
require(['module1'],function(){});
});
});
});
page1.html
<div>
<button id="button_1">Click Me!!</button>
</div>
module1.js
define(['jquery'],function($){
$(function(){
$("#button_1").click(function(){
$("#buttonContainer").load("page2.html");
require(['module2'],function(){});
});
});
});
page2.html
<div>
<button id="button_2">Back</button>
</div>
module2.js
define(['jquery'],function($){
$(function(){
$("#button_2").click(function(){
$("#buttonContainer").load("page1.html");
require(['module1'],function(){});
});
});
});
При щелчке начала в index.html div заполняется Click me !! , при щелчке Click me !! DIV заполняется кнопку Назад и нажатием кнопки Назад Нажмите еще раз меня !! заполняется и наоборот.
При загрузке jquery html я вызываю require().. для вызова соответствующей js-функции для html. Правильно ли мой подход?
Ваш подход неправильный. Ваш код будет работать, если требуется, чтобы module1
и module2
выполняли фабрику модулей каждый раз, когда ваш код требует модулей. Однако, как работает RequireJS, фабрика модулей выполняется только в первый раз, когда требуется модуль. ("Заводская" - это обратный вызов, который вы передаете, define
при определении модуля.)
Мне непонятно, что гарантирует деление кода на модули так, как это делается в вопросе. Это кажется ненужным.
Если есть причина разделить на модули так, как это делается в вопросе, то я бы сделал модули действовать на странице только при вызове функции. Тогда module1.js
может быть чем-то вроде:
define(['jquery', 'module2'], function ($, module2) {
return function () {
// Whatever actions I want...
};
});
module2
будет структурирован как module1
. main.js
будет что-то вроде:
require(['jquery', 'module1'], function ($, module1) {
$(function () {
[...]
// This calls the function you returned when defining module 1.
module1();
[...]
});
});