这有点难以描述但是这里有。我正在构建一个类似于Azure后端的页面,用户从左侧的菜单中选择加载项目的页面,在其右侧称为AllUsers。从AllUsers中有该项目的选项,其中一些可能会在其左侧加载另一个项目,我们将调用该用户。从用户可以打开更多项目。
我使用类似
的JS对象很好地设置了它var AdminPage=function(){
this.con="../controllers/admin/admin_con.php";
this.pageName=null;
this.childPage=null;
this.page=null;
this.deleteItem=function(){
//Recursively deletes pages to the right
if(this.childPage){
this.childPage.delete();
this.childPage=null;
}
if(this.page){
this.page.remove();
}
return this;
}
this.add=function(pageData){
if(this.childPage){
this.deleteItem();
}
this.childPage=new AdminPage();
this.childPage.getPage(pageData);
return this;
};
this.getPage=function(pageData){
var that=this;
this.pageName=pageData.page;
$.post(this.con, pageData,
function(data,status){
if(status==='success'){
$("#rightCol").append(data);
var num=$("#rightCol").children().length;
that.page=$("#rightCol").children()[num-1];
eval(pageData.page+"=that");
}
}
);
return this;
};
}
因此,每次添加页面时,它都会为该项目创建一个新的对象实例。如果该项目被删除,它也会递归删除它右侧的所有项目。
“eval(pageData.page +”= that“);”是的,我现在认为eval是邪恶的,已经阅读了所有相关内容,从已添加的项目名称创建一个新的变量名称。该项目表示User项目甚至在需要调用其脚本实例时使用该变量。这一切都非常完美。
如果失败的是User项打开另一个,请将其称为Connections,显示该用户的所有连接。然后,我希望能够单击一个连接并让它打开另一个用户项,这样就可以解决第二个用户项打开时的问题,并创建一个新的AdminPage实例,因为同一个脚本只是加载并具有与前一个JS变量相同的名称。然后影响几件事。如果你关闭其中一个,它会关闭两个例如,如果你关闭第一个加载它应该关闭它右边的内容但是childPage属性现在是空的,所以这不起作用。
所以现在问题..
是否有更好的方法来处理创建变量,或者是否有更好的方法可以完全解决这个问题?
我可以使用Evil eval,让世界上的一切正确吗?
感谢你提出的任何建议。
答案 0 :(得分:0)
所以我找到了问题的答案,但我仍然不喜欢它。
我已经生成了一个唯一的id,并将其附加到我用作变量的脚本名称的末尾。
这个方法的问题是它仍然使用eval,现在我必须在获取新项目时传递变量往返,以便我可以使用php将变量名称注入页面。
不完美,必须有更好的方法。
这是更新的添加功能
this.add=function(pageData){
if(this.childPage){
this.deleteChildren();
}
this.childPage=new AdminPage();
this.childPage.id=pageData.page+"_"+(Math.floor(Math.random() * (999999999 - 100000000 + 1)) + 100000000);
eval(this.childPage.id+"=this.childPage");
this.childPage.getPage(pageData);
return this;
};