Как получить доступ к переменным модуля с помощью requireJS?
Я использую Javascript какое-то время, и я только что пробовал использовать модули и requireJS в первый раз и нелегко разглядеть новые шаблоны дизайна!
Вот моя первая попытка:
require([
"jquery",
"testModule"
], function ($, testModule) {
$(function () {
var testInstance1 = testModule;
testInstance1.setID(11);
alert(testInstance1.id);
});
});
и testModule.js
define([
'jquery'
], function ($) {
var id = 0;
var setID = function (newID) {
id = newID;
return id;
};
return {
setID: setID,
id:id
};
});
Это возвращает 0, и я ожидал 11. Что мне не хватает?
Это также упрощенный пример. Я хотел бы создать несколько объектов, и каждый должен сохранять свои собственные переменные в состоянии. Например, если бы я хотел, чтобы модуль добавлял список в контейнер DIV
, но также содержал функции для добавления, очистки или запроса данных в этом списке, как я должен структурировать функции модуля, чтобы каждая реализация сохраняла свое собственное состояние.
Спасибо
Ответы
Ответ 1
На самом деле вы не видите ничего, что связано с этим. Проблема в том, что только объекты передаются по ссылке (и, возможно, массивы.. не могут помнить наверняка прямо сейчас). Числа нет. Итак, когда вы вернули {setID: setID, id: id}, 'id' получил значение "id", больше никогда не обновлялось. То, что вы хотите сделать, это использовать функцию типа getID, которая будет ссылаться на исходную переменную, а не на исходное значение переменной:
return {
setID: setID,
getID: function () {return id;}
};
а затем...
testInstance1.setID(11);
alert(testInstance1.getID());
Ответ 2
Если вы хотите иметь два экземпляра testModule, вам нужно вернуть testModule в качестве функции. Затем, когда вы это требуете, вы можете создать несколько экземпляров с помощью new
.
Пример 1
testModule.js
define([
'jquery'
], function ($) {
function TestModule() {
var self = this;
// anything attached to self or this will be public
self.id = 0;
self.setID = function (newID) {
self.id = newID;
return self.id;
};
}
return TestModule;
});
main.js
require([
"jquery",
"testModule"
], function ($, TestModule) {
$(function () {
var testInstance1 = new TestModule();
var testInstance2 = new TestModule();
testInstance1.setID(11);
testInstance2.setID(99);
alert(testInstance1.id); // Should return 11
alert(testInstance2.id); // Should return 99
});
});
Или, если вы хотите получить фантазию, вы можете защитить определенные свойства или функции в testModule.
Пример 2
testModule.js
define([
'jquery'
], function ($) {
function TestModule() {
var self = this;
var privateID = 0;
function privateToString() {
return 'Your id is ' + privateID;
}
// anything attached to self or this will be public
self.setID = function (newID) {
privateID = newID;
};
self.getID = function () {
return privateID;
};
self.toString = function () {
return privateToString();
};
}
return TestModule;
});
main.js
require([
"jquery",
"testModule"
], function ($, TestModule) {
$(function () {
var testInstance1 = new TestModule();
var testInstance2 = new TestModule();
testInstance1.setID(11);
testInstance2.setID(99);
alert(testInstance1.getID()); // Should return 11
alert(testInstance2.getID()); // Should return 99
alert(testInstance1.privateID); // Undefined
alert(testInstance1.toString()); // Should return "Your id is 11"
});
});
Если вам нужен только один экземпляр, например singleton, вы можете вернуть TestModule с помощью ключевого слова new
.
Пример 3
testModule.js
define([
'jquery'
], function ($) {
function TestModule() {
var self = this;
// anything attached to self or this will be public
self.id = 0;
self.setID = function (newID) {
self.id = newID;
return self.id;
};
}
return new TestModule();
});
main.js
require([
"jquery",
"testModule"
], function ($, testModule) {
$(function () {
var testInstance1 = testModule;
var testInstance2 = testModule;
testInstance1.setID(11);
testInstance2.setID(99);
alert(testInstance1.id); // Should return 99
alert(testInstance2.id); // Should return 99
});
});