- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用PHP和JavaScript构建项目管理应用程序。这个问题更多是围绕JavaScript方面,而更多是架构问题。
因此,我有多个JavaScript对象/类类型文件,这些文件基本上类似于“模块” ...
TaskModal.js
ProjectForums.js
TaskList.js
仅列举一些处理应用程序部分的JavaScript文件。
还有更多。但是它们都具有一个共同点,那就是它们都需要共享访问某些数据位。
例如用户列表。我的大多数JavaScript文件都需要访问数据库中所有用户的用户列表。
因此,为避免我的所有JS文件查询数据库以建立一个单独的用户列表,我打算使用PHP注入Global JS var作为JSON对象,以保存用户列表并允许所有JS文件访问1个用户列表!
为了更进一步,我在第一个JS文件中构建了一个JS函数,该文件将检查是否存在从PHP创建的全局用户列表,如果找不到,则它将发出AJAX请求并获取列表。本身!
如果必须使用AJAX提取列表,则将其设置为其他JS文件的Global userList变量,以希望也避免发出自己的AJAX请求。
因此,用户列表将被缓存,以供所有人访问,并提供冗余后备以确保其已加载!
在我的TaskModal.js
文件中,这是我添加此AJAX后备广告的第一个文件,用于检查Global范围中的Userlist,然后在Global中找到它,它将缓存到本地var。如果不是,则发出AJAX请求。
通过这种理论和设计,我基本上需要在所有JS文件中复制相同的用户功能,并且我认为这也许不是他的最佳方法。
我是否应该改用一个单独的User对象来处理上述所有功能,并且单独JS文件上用户的唯一功能将仅仅是访问该User对象?
下面是一个简单的示例,说明TaskModal.js对象具有其自己的用户功能。是否应该将所有这些内容移到单独的User对象?如果是的话,这是否会使从我所有JS文件访问用户数据的想法变得更加有趣?
(function (window, document, $, undefined) {
"use strict";
//we cache a few useful values, like jQuery wrapped window and document
var $window = $(window),
$document = $(document),
projectTaskModal = {
// Cache Properties
cache: {
isUserObjLoaded: false,
userList: '',
isAjaxRequestPending: false,
getUserListUrlEndpoint: '/post',
user: {},
deferred: '',
},
/**
* Initialize projectTaskModal Object and fire off some other init functions
* @return {[type]} [description]
*/
init: function() {
projectTaskModal.users.initUserList();
projectTaskModal.users.getUserList();
projectTaskModal.cache.user = projectTaskModal.users.getUserById('1gdfgdfkn123423423');
console.log('cached User object:', projectTaskModal.cache.user);
},
// Get Userlist and other user related functions
users: {
initUserList: function() {
// check for local Flag indicating that Userlist has been loaded.
// a userlist loaded into DOM as Global var from PHP
if(projectTaskModal.cache.isUserObjLoaded){
// Local copy of userlist has already been loaded so we will not search for
// it in the Global DOM + Not make a server AJAX request to load it
//
// Just return our local cached copy of Userlist
return projectTaskModal.cache.userList;
}else{
// this.cache.isUserObjLoaded is FALSE so we must search Global DOM for userlist
// generated from PHP.
if (!window.hasOwnProperty('globalUserList')) {
alert('Global userlist is not loaded so load it ourself using AJAX request');
// Global userlist is not loaded so load it ourself using
// AJAX request and Promise.
var loadUserListAjax = projectTaskModal.users.ajaxLoadUserListData()
.done(function(response) {
console.log(response);
alert('AJAX request success');
// Parse JSON response var
var userListJson = response;
// next set FLAG that userList is loaded
projectTaskModal.cache.isUserObjLoaded = true;
// After loading userlist from server, cache it locally and to global var for other
// JS scripts to use and prevent them from also making AJAX requests!
projectTaskModal.cache.userList = userListJson;
window.globalUserList = userListJson.user_list;
projectTaskModal.cache.isAjaxRequestPending = false;
projectTaskModal.users.getUserList();
}).fail(function(response) {
// AJAX request failed
console.log('response', response);
alert('AJAX request failed');
}).always(function(response) {
projectTaskModal.cache.isAjaxRequestPending = false;
// Hide Loader/Spinner
setTimeout($.unblockUI, 1000);
});
}else{
alert('Global userlist is loaded so cache it locally and do not make AJAX request!');
// cache the Global userlist var to local property
projectTaskModal.cache.userList = window.globalUserList;
// next set FLAG that userList is loaded
projectTaskModal.cache.isUserObjLoaded = true;
projectTaskModal.users.getUserList();
}
}
},
ajaxLoadUserListData: function() {
projectTaskModal.cache.isAjaxRequestPending = true;
return $.ajax({
type: 'POST',
async: true,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
url: '/restful/fortune',
data: {
action: 'load-userlist'
},
});
},
getUserList: function() {
if(projectTaskModal.cache.isUserObjLoaded){
console.log('userList',projectTaskModal.cache.userList);
}else{
console.log('userlist Obj not loaded =(');
}
},
getCurrentUser: function(user_id) {
if(projectTaskModal.cache.isUserObjLoaded){
myUserData[1].username
console.log('userList',projectTaskModal.cache.userList);
}else{
console.log('userlist Obj not loaded =(');
}
},
getUserById: function(user_id) {
var userList = projectTaskModal.cache.userList;
for (var i = 0; i < userList.length; i++) {
if (userList[i].id === user_id) {
user = {
id: userList[i].id,
username: userList[i].username,
role: userList[i].role,
gravatar: userList[i].gravatar,
}
return user;
}
}
throw "Couldn't find object with user_id: " + user_id;
},
},
};
// Run Init on DOM Ready
$(function() {
projectTaskModal.init();
});
}(this, document, jQuery));
Userlist
,
Debug/Mocking
,
Milestones List
,
Tags List
等!
User{}
对象。
最佳答案
您可以通过使一组js文件处理数据层来进一步分离您的关注点。我们可以将其命名为services
。还有另一组modules
,它将处理应用程序(或UI插件,例如图片库)的流程并使用由数据层管理的数据。这听起来很漂亮,也很有趣,让我们以我喜欢在某些项目上使用的模式跳入代码。
在我加载的第一个js文件中,我为项目定义了一个全局名称空间
// main.js
(function(){
window.MyCoolProject = {
services: {},
modules: {},
helpers: {},
laserGuns: {},
etc: {}
};
})();
// services/user.js
// this file has all the functions required to load user data, these will be a bunch of ajax calls
(function(){
// we can use this to cache data, even though we can cache via jquery. more on this later
var cached = {};
MyCoolProject.services.UserService = {
getUsers: function(callback){
// if the cache object has a 'users' property, we have already loaded this data so we returned the cached version of this. Note that we don't return data, we pass it through a callback as a asynch call
if (cache.users){
callback(cache.users);
return;
}
// if there is no cached data, we make the ajax call
$.ajax({
url: 'path/to/api.json'
method: 'GET',
// jquery also provides a cache for ajax calls, you can experiment with both to see which better suits your needs
cache: true,
success: function(data){
// once loaded we can manually cache the data
cache.users = data;
callback(cache.users);
}
});
},
getUser: function(id, callback){ ... },
etc: function(callback){ ... }
};
})();
MyCoolProject.services.UserService.getUsers(function(users){
console.log(users); // will be the same list of users, despite how many times you call it. You will get the same cached version
});
var a = {},
b = a,
c = b;
a
与
c
相同,并且对
a
的任何更改都将反映在
c
中。在内部,它是相同的内存块,但是我敢肯定还有比我更有资格解释这一点的人。如果将同一数据对象放入其他位置,则基本上不必担心内存消耗。您需要注意的是,一个模块不会更改该数据,因为其他所有模块都会更改。如果在某些情况下需要更改数据对象,则必须先对其进行克隆(请参见jquery中的$ .extend())。
// modules/userImageGallery.js
// a strange image gallery that shows a mugshot of each user
(function(){
// we autoexecute the module and push its public methods into its namespace
MyCoolProject.modules.UserImageGallery = (function(){
var users = [];
MyCoolProject.services.UserService.getUsers(function(data){
users = data;
});
function next(){ currentUserIndex++; }
function prev(){ currentUserIndex--; }
... etc ...
// we expose the desired methods
return{
next: next,
prev: prev
};
})();
})();
// now we, or any other module, can control the image gallery by calling
MyCoolProject.modules.UserImageGallery.next();
关于javascript - 最好使用单独的JavaScript对象在许多其他JS对象之间共享数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31622621/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!