AngularJS 实现树形结构图的选中

阅读时长 19 分钟读完

在前端开发中,树形结构图是非常常见的一种数据展示方式。而其中,实现树形结构图的选中操作则是非常关键的一部分。在本篇文章中,我们将介绍如何使用 AngularJS 来实现树形结构图的选中功能,不仅详细地介绍相关知识点,还会提供实践中所需的示例代码,供读者参考。

准备工作

在开始介绍实现步骤前,我们需要先明确需要准备的一些工作。首先,我们需要一个 AngularJS 的开发环境,并且需要引用 AngularJS 的核心文件。其次,我们需要一个数据源,数据源可以是本地的 JSON 格式文件,也可以是通过 Ajax 请求获取到的远程数据。本文中,我们将以一个简单的 JSON 数据为例进行介绍,其结构如下:

-- -------------------- ---- -------
-
    -
        ----- --
        ------- ------
        ----------- -
            -
                ----- --
                ------- --------
                ----------- --
            --
            -
                ----- --
                ------- --------
                ----------- -
                    -
                        ----- --
                        ------- ----------
                        ----------- --
                    -
                -
            -
        -
    --
    -
        ----- --
        ------- ------
        ----------- -
            -
                ----- --
                ------- --------
                ----------- -
                    -
                        ----- --
                        ------- ----------
                        ----------- --
                    -
                -
            -
        -
    -
-

该数据结构由 id、name、children 三个属性构成,用于表示树节点的唯一标识、名称以及子节点的信息。同时,我们还需要定义一个数据模型,用于存储选中的节点信息。我们的数据模型中包含一个数组类型的 selectedNodes 属性,用于存储每个被选中节点的 id 值。数据模型的代码如下:

实现步骤

在准备工作完成后,我们就可以开始具体实现树形结构图的选中功能了。接下来,我们将介绍基本的实现步骤:

1. 在 HTML 中创建树形结构图模板

在 HTML 中,我们需要创建一个模板来展示树形结构图。这里我们使用 AngularJS 的 ng-template 指令来定义该模板,代码如下:

-- -------------------- ---- -------
------- ----------------------- --------------------
    --- -------------------- -------------------------
        ----- --------------------------------------------------
        --- ------------------------------ - ---
            --- ---------------- -- -----------------
                -----------------------------
                -----------------------------
                -
            -----
        -----
    -----
---------

在上面的代码中,我们使用 ng-class 指令来判断当前节点是否被选中,为选中的节点添加 selected CSS 类名。同时,我们通过 ng-click 指令来监听节点的点击事件,并在点击时调用 toggle 方法来添加或移除当前节点的 id 值,同时更新数据模型中 selectedNodes 的值。最后,我们通过 ng-include 指令来递归创建所有子节点。

2. 创建 treeItem 组件

接下来,我们将创建一个 treeItem 组件来管理单个树节点的状态,并处理节点的点击事件。该组件的代码如下:

-- -------------------- ---- -------
-----------------------
    ---------------------- -
        --------- ----
        ------------ -----------------
        --------- -
            ----- ----
            ---------- ---
        --
        ----------- ------------------- -
            --- -- - -----

            ------------- - ------------ -
                ------ ----------------------------------- - ---
            --

            --------- - -------------- -
                --- ----- - -----------------------------------------

                -- ------ - --- -
                    ------------------------------------- ---
                - ---- -
                    --------------------------------------
                -
            --
        --
        ------------- ----
    ---

在上面的代码中,我们使用 component 方法来创建一个名为 treeItem 的组件,并使用 templateUrl 参数来指定节点模板的位置。我们还通过 bindings 参数来定义组件的输入参数,其中 node 属性用于接受当前节点的信息,而 setParent 属性则用于接收一个在递归子节点时调用的方法。

在组件的 controller 中,我们定义了两个方法:isSelectedtoggleisSelected 方法用于判断当前节点是否被选中,如果在数据模型中的 selectedNodes 数组中包含当前节点的 id 值,则返回 true,否则返回 false。toggle 方法用于添加或移除当前节点的 id 值,同时更新数据模型中 selectedNodes 的值。

3. 在 控制器 中递归创建树形结构图

在 HTML 中创建好节点模板之后,我们需要在控制器中递归使用该节点模板来创建整个树形结构图。代码如下:

-- -------------------- ---- -------
-----------------------
    ----------------------- ---------------- ---------- -
        ----------- - -
            -
                ----- --
                ------- ------
                ----------- -
                    -
                        ----- --
                        ------- --------
                        ----------- --
                    --
                    -
                        ----- --
                        ------- --------
                        ----------- -
                            -
                                ----- --
                                ------- ----------
                                ----------- --
                            -
                        -
                    -
                -
            --
            -
                ----- --
                ------- ------
                ----------- -
                    -
                        ----- --
                        ------- --------
                        ----------- -
                            -
                                ----- --
                                ------- ----------
                                ----------- --
                            -
                        -
                    -
                -
            -
        --

        ---------------- - -------------- -
            ----------- - -------
        --

        --------- - -
            ----------- ------------ -
                ------ ----------------------------------- - ---
            --

            ------- -------------- -
                --- ----- - -----------------------------------------

                -- ------ - --- -
                    ------------------------------------- ---
                - ---- -
                    --------------------------------------
                -
            -
        --
    ---

在上面的代码中,我们定义了一个名为 treeCtrl 的控制器,并在其中定义了名为 data 的数据源和名为 setParent 的方法。这两个属性用于在递归子节点时传递父节点的相关信息。

同时,在控制器的 vm 属性中,我们定义了与 treeItem 组件中相同的 isSelectedtoggle 方法,用于管理选中状态。

最后,在 HTML 模板中,我们通过 ng-repeat 指令使用 treeItem 组件递归创建树形结构图,如下所示:

示例代码

到这里,我们已经详细介绍了 AngularJS 实现树形结构图选中的步骤和相关知识点。同时,在上面的示例代码中,我们还提供了完整实现的示例代码供读者参考,帮助读者更加清晰地了解如何实现具体的代码功能。

-- -------------------- ---- -------
--------- -----
----- ---------------

------
    ----- ----------------
    ---------------- ------------------
    ------- ------------------------------------------------------------------------------------
    ----- -------------------------------------------------------------------- -----------------
    -------
        --------- -
            ----------------- -----
        -
    --------
-------

----- -------------------------
    ------- ----------------------- --------------------
        --- -------------------- ----------------------------
            ----- -----------------------------------------------------
            --- ------------------------------ - ---
                --- ---------------- -- -----------------
                    -----------------------------
                    -----------------------------
                    -
                -----
            -----
        -----
    ---------
  
    ---- ------------------
        ------------- ---------------
        ----

        ----
            --- --------------- -- -----
                -----------------------------
                -------------------------
                -
            -----
        -----

        ----
        ---------- ------------------------------------
    ------

    --------
        ----------------------- ---
            --------------------- ---------- -
                ------ -
                    -------------- --
                --
            --
            ---------------------- -
                --------- ----
                ------------ -----------------
                --------- -
                    ----- ----
                    ---------- ---
                --
                ----------- ------------------- -
                    --- -- - -----

                    ------------- - ------------ -
                        ------ ----------------------------------- - ---
                    --

                    --------- - -------------- -
                        --- ----- - -----------------------------------------

                        -- ------ - --- -
                            ------------------------------------- ---
                        - ---- -
                            --------------------------------------
                        -
                    --
                --
                ------------- ----
            --
            ----------------------- ---------------- ---------- -
                ----------- - -
                    -
                        ----- --
                        ------- ------
                        ----------- -
                            -
                                ----- --
                                ------- --------
                                ----------- --
                            --
                            -
                                ----- --
                                ------- --------
                                ----------- -
                                    -
                                        ----- --
                                        ------- ----------
                                        ----------- --
                                    -
                                -
                            -
                        -
                    --
                    -
                        ----- --
                        ------- ------
                        ----------- -
                            -
                                ----- --
                                ------- --------
                                ----------- -
                                    -
                                        ----- --
                                        ------- ----------
                                        ----------- --
                                    -
                                -
                            -
                        -
                    -
                --

                ---------------- - -------------- -
                    ----------- - -------
                --

                --------- - -
                    ----------- ------------ -
                        ------ ----------------------------------- - ---
                    --

                    ------- -------------- -
                        --- ----- - -----------------------------------------

                        -- ------ - --- -
                            ------------------------------------- ---
                        - ---- -
                            --------------------------------------
                        -
                    -
                --
            ---
    ---------
-------

-------

总结

在本篇文章中,我们介绍了如何使用 AngularJS 实现树形结构图选中的相关知识点,并提供了详细且实现完整的示例代码,读者可以根据本文提供的实践步骤和示例代码来学习和使用。需要注意的是,虽然本文中我们介绍了 AngularJS 的版本和示例代码,但是我们认为,无论是 AngularJS 还是其他前端框架,相关实现的知识点和应用流程都是相似的,读者可以根据自身的实际情况,选定一个合适的框架来进行应用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6462ef61968c7c53b03fccc7

纠错
反馈