我是Javascript / backboneJS / RequireJS的新手。为了渲染我的前端,我制作了一个控制器,一个模型和一个视图。另外,我的html文件中有一个下拉列表。
所以到目前为止,我所做的是在我的
require(['common'],function()
{
require(['jquery','fastclick','nprogress','charts','underscore','spinner'],function()
{
require(['firstDashboardController']);
});
});
所以我正在加载" firstDashboardController"并且该控制器相应地加载所有模块并在前端显示数据。所以一切正常。
现在我在前端有一个下拉列表。当我选择下拉列表时,根据所选的id我想要检索数据。所以我需要调用" firstDashboardController"再次,以便根据我所获得的新ID呈现所有内容。
那我该怎么办?就像我需要UN-REQUIRE我的" firstDashboardController"然后再次要求它传递新的id。因为控制器已经通过Require beacuse加载,所以我将其加载到我的HTML文件中,如上所述。但我需要按照通过下拉菜单选择的新ID再次加载它。那怎么去呢?请帮助我。如果需要任何代码片段,我可以把它。
代码段:
我的控制器:
define(['backbone', 'firstSubViewModel','dropdownViewModel', 'dropdownModel'],
function(Backbone, firstSubViewModel, dropdownViewModel, dropdownModel) {
var ch = new dashboardModel.chart({});
if (localStorage.getItem('p_kt') && localStorage.getItem('p_acid') && localStorage.getItem('p_seid')) {
var data = {
tokenProp: localStorage.getItem('p_kt'),
accountIdProp: localStorage.getItem('p_acid'),
sessionIdProp: localStorage.getItem('p_seid')
};
$.when(
ch.fetch(data) // GETTING DATA FROM MODEL VIA AJAX CALL in my model.JS
).then(function() {
// Main Graph on Dashboard
new firstSubViewModel({
el: '#chartAnchor1',
model: ch
});
});});
我不知何故需要再次致电ch.fetch()
。
答案 0 :(得分:1)
您没有正确定义控制器。您目前将它作为一次性设置方法而不是稍后可以重新运行的方法。让我们一步一步走。
myLife.js:
define([], function() {
return "a complex series of failures";
});
通过返回来自define回调的值,这定义了我需要" myLife"然后它将提供"一系列复杂的失败& #34;在回调函数中。这就是Backbone和其他AMD模块在代码块中出现的情况。但是,它只运行一次内容;并保存结果。所以,这不会起作用:
incrementer.js:
var x = 0;
define([], function() {
x = x + 1;
return x;
});
(试图要求增量器总是给你" 1"。)
您要做的是返回功能 - 您可以随时重新运行。
incrementerV2.js:
define([], function() {
var x = 0;
return function() {
x = x + 1;
return x;
};
});
在任何文件中,您都可以拥有:
require(['incrementerV2'], function(myIncr) {
myIncr(); // 1
myIncr(); // 2
});
...而且,为了记录,我建议尽可能在任何给定文件中只有一个require
语句。如果加载顺序很重要,您可以在第一个参数数组中添加依赖项。
更常见的是,人们将有一个模块包含一个自定义对象,其中包含多个函数,而不是我上面给出的函数。返回然后只使用一个函数也是有效的,具体取决于用例。任何变量类型都有效,但只要记住,只要你以后需要它,它将始终是唯一的变量。
当系统检索上面的myLife.js或incrementer.js时,在实际运行我们定义的定义函数之前,还有一个中间步骤。它将查看第一个参数,即命名依赖项的数组,并确定在运行给定函数之前是否还需要依赖项。例如:
a.js: require(['b', 'c'], function(b, c) {
b.js: define(['c'], function(c) {
c.js: define([], function() {
首先请求a.js,但不运行因为它需要B和C. B接下来加载,但由于未加载C而被忽略。 C运行,然后将其返回值传递到A和B.此系统内部非常智能,并且永远不应该请求相同的文件两次,或者如果一个文件在另一个文件之前加载则会发生冲突。您可以像使用Java中的导入一样使用它。
另外,我们假设您只在'c'
中添加了a.js
,以便b.js
不会崩溃,因为它需要先加载 - 在这种情况下,把它从A中拿出来它应该也一样。
a.js: require(['b'], function(b) {
就像A一样,B会在执行任何操作之前自动加载所有依赖项。一个简单的原则是只引用一个依赖项,如果它实际上直接在文件中引用(或定义了必要的全局变量)