【发布时间】:2013-08-09 10:52:19
【问题描述】:
我正在尝试使用现有的工作代码库并使用 JavaScript 使其面向对象。我的系统采用一对多关系中包含 groups 和 items 的 JSON,并在页面上将其可视化。这些项目可以移动到不同的组中,并且它们在这些组中的位置也需要计算。因此,需要建立了解周围团体和门票的活动。
我正在使用John Resig's 简单的JavaScript 继承设置来建立两个类,Item 和Group。当每个Item 被实例化时,它会引用它的父Group。 我的问题出现在我想建立我的事件时,最容易用以下函数解释:
var Group = Class.extend({
...
// Calculate where to place the new item within the group
calculate_new_position: function(item) {
var pos = -1;
// Loop through all DOM items in groups body
$(".item", this.elBody).each(function(i) {
// Retrieve it's class object
var next = $(this).data("_obj");
// Calculating things using the class reference
var lowerPrio = item.tData.priority < next.tData.priority,
lowerId = item.id < next.id;
if(lowerPrio || lowerId) {
pos = i;
return false;
}
});
return pos;
},
...
)};
注意上面sn-p中.data("_obj")的使用。本质上,当我需要对项目进行排序等操作时,我需要知道组中每个项目的 DOM(视图/控制器)对应的对象(模型)。现在,我可以建立我的Group 类,这样当我创建每个Item 时,我会从我的Group 中添加对它的引用(例如Group.items = [i1, i2...]),而不是迭代DOM 元素,我可以迭代 Item 实例。但是我认为我会遇到类似的问题,例如当我想将Item 移动到不同的Group 时(因为Group 不会知道Item)。
长话短说:有一个类在实例化时创建一个 DOM 元素,然后又指向该类,这在本质上是危险的/幼稚的/毫无意义的吗?这感觉像是循环依赖和一些递归的噩梦,但也许对对象的引用并不是一件可怕的事情。如果我在做其他任何事情真的愚蠢,并且有一个更简单的方法,那么也请指出这一点。
【问题讨论】:
-
你看过Backbone.js是怎么做的吗?
view对象包含对model(您的 Item、Group 类)和 DOM 元素el的引用。有多种方法,Backbone.js 不推荐任何一种方法:backbonejs.org/#FAQ-tim-toady
标签: javascript jquery oop circular-dependency