【问题标题】:JavaScript/jQuery DTOs/Objects to hold State保存状态的 JavaScript/jQuery DTO/对象
【发布时间】:2010-12-04 23:21:23
【问题描述】:

我通常是一名 C# 开发人员,但主要使用 jQuery 编写客户端应用程序。

这相当简单:我有一个“组”列表,其中包含一些参数(如组名)和一个“用户”列表,它们也有一些参数。

目前我尝试使用具有特定 ID 的 <li> 来管理它,因此需要进行大量字符串匹配才能将 <li id="group-2">Name - ExtraInfo</li> 重新转换为我可以使用的东西。

我觉得这种方法很愚蠢,因为 a) 我使用 UI 作为状态的后端 b) 我依赖字符串解析而不是使用真实对象。

在 C# 中,我只会创建一个 DTO(本质上是一个 List<Group>),但我在 JavaScript/jQuery 方面没有足够的经验来做到这一点。

谁能给我一些快速提示如何创建自定义对象和管理这些对象的列表?

【问题讨论】:

    标签: javascript jquery architecture


    【解决方案1】:

    我只使用数组和对象(比如说 JSON):

    var groups = [
        {
            name: "Name",
            info: "Extra"
        },
        {
            name: "Name",
            info: "Extra"
        }
    ];
    

    关于数组的操作。 jQuery 有一些array utilities。对于您评论中的问题,您可以使用 grep:

    var filteredGroups = groups.grep(function (group, i) {
        return group.name == "What I'm interested in";
    });
    

    它相当于 Linq 中的 Select().Where()(我不是 .NET 专家,所以可能有些东西不匹配)。

    无论如何,这只是 MVC 结构的模型部分。您仍然需要一些函数来将一组组映射到 <ul> 元素。这样你也能看到风景。

    【讨论】:

    • 谢谢。我可以轻松修改这个数组吗? (从名称等于“某物”的数组中删除)?我认为 UI 操作应该使用 jQuery 直接进行(找到
        ,删除所有
      • ,循环遍历数组并将每个元素创建为
    • 是的,有一个 delete 运算符可以做到这一点:找出包含名称为“Something”的对象的数组索引,并发出delete groups[i](但请注意,其他数组成员将保留他们的索引!)
    • P.S.:也许在这里使用嵌套对象而不是对象数组更直观。您还可以通过 ID 直接查找子对象,而无需 grep()
    【解决方案2】:

    扩展 Ionut G. Stan 的回答,我建议使用嵌套对象:

    var groups = {
      group1: {
        name: "Group 1",
        users: {
          uid1: { name: "User 1" },
          uid2: { name: "User 2" },
          uid3: { name: "User 3" }
        }
      },
      group2: {
        name: "Group 2",
        users: {
          uid1: { name: "User 1" },
          uid4: { name: "User 4" }
        }
      }
    };
    
    • 检查:
      if ("group1" in groups && "uid1" in groups["group1"].users) /* ... */;
    • 获取:
      var username = groups["group1"].users["uid1"].name
    • 删除:
      delete groups["group1"].users["uid1"];
    • 地址:
      groups["group1"].users["uid4"] = { name: "User 4" };

    为了避免不必要的重复和插入悖论:

    // all relevant users, for look-up purposes
    var allUsers = {
      uid1: { name: "User 1" },
      uid2: { name: "User 2" },
      uid3: { name: "User 3" },
      uid4: { name: "User 4" }
    }
    
    // groups reference the ID only, details are in allUsers["uid1"] etc
    var groups = {
      group1: {
        name: "Group 1",
        users: {uid1: 1, uid2: 1, uid3: 1}
      },
      group2: {
        name: "Group 2",
        users: {uid1: 1, uid4: 1 }
      }
    };
    
    • 检查:
      if ("group1" in groups && "uid1" in groups["group1"].users) /* ... */;
    • 获取:
      var username = allUsers["uid1"].name
    • 删除:
      delete groups["group1"].users["uid1"];
    • 地址:
      groups["group1"].users["uid4"] = 1;

    【讨论】:

    • 看起来像 C# 的匿名类型,有趣。我也可以有功能吗?即 group1: { name: "Group 1", Dialog: function() { alert(name); }
    • 当然。在 JavaScript 中,一切都是对象,所以函数也是对象。 ;-)
    【解决方案3】:

    您可以使用如下结构。您可能希望更详细地充实它,并且 group 可能对内部用户数组具有类似的结构。此外,对不可能的值(如 id = -201)进行一些错误处理也不会受到伤害。

    function Group(id, name, info)
    {
        var _id = id;
        var _name = name;
        var _info = info
    
        this.getID = function()
        {
            return _id;
        }
    
        this.getName = function()
        {
            return _name;
        }
    
        this.getInfo = function()
        {
            return _info;
        }
    }
    
    function GroupList()
    {
        var _groups = [];
    
        this.addGroup = function(group)
        {
            _groups.push(group);
        }
    
        this.getGroup = function(id)
        {
            var group;
            for(var index = 0, length = _groups.length; index < length; ++index)
            {
                group = _groups[index];
                if (id === group.getID())
                {
                    return group;
                }
            }
        }
    }
    

    如果您要采用上述 OOP 样式,我建议您使用 Prototype,因为它使类继承更容易。然后只需编写一个通用列表并从中扩展(参见http://api.prototypejs.org/language/class.html)。除其他外,Prototype 还提供了一组非常广泛的函数,用于处理数组和枚举(请参阅http://api.prototypejs.org/language/enumerable.html)。

    【讨论】:

      【解决方案4】:

      你不应该关心匹配 this 的字符串是由 jQuery 包装的!

      没有 jQuery 的最快方法是

      document.getElementById('idOfLiElement');
      

      【讨论】:

      • 是的,但目前我正在将我的参数“编码”成一个字符串。我的 HTML 看起来像
      • Name - ExtraInfo
      • ,它编码了 3 个参数:一个 ID (2) 一个名称 (Name) 和一些额外的信息 (ExtraInfo)。如果我想阅读这篇文章,我需要从中解析出字段。我想从这种方法转向真正的面向对象方法,但我还不知道怎么做。
    • 好的,我明白了,然后使用 JSON 作为您的“前端对象表示法”,正如 Ionut G. Stan 在他的回答 stackoverflow.com/questions/1537348/… 中所示。
    • 【解决方案5】:

      您也可以使用jQuery的数据函数来存储组以便于检索。

      var group1 = {
       name: "Group 1",
       users: {
        uid1: { name: "User 1" },
        uid2: { name: "User 2" },
        uid3: { name: "User 3" }
       }
      }
      
      $('#ArbitraryElementID').data('Group 1', group1);
      

      那么你可以使用:

      var group1 = $('#ArbitraryElementID').data('Group 1');
      

      检索对象。

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签