AngularJs 1.5 - 基于组件的架构、绑定和良好实践

Posted

技术标签:

【中文标题】AngularJs 1.5 - 基于组件的架构、绑定和良好实践【英文标题】:AngularJs 1.5 - Component Based Architecture, Bindings and Good Practices 【发布时间】:2017-03-18 05:51:37 【问题描述】:

按照我的问题 Angularjs 1.5 - CRUD pages and Components

我还有一些关于基于组件的架构的设计问题。

1- 根据指南,如果我有一个带有来自父级绑定的子组件,我应该在父级上处理数据操作。那么,我是保存数据,例如,在父级还是在子级?

例子

 <my-child on-save="$ctrl.save"></my-child>

MyChild 组件包含一个用于保存数据的表单。 在这种情况下,我应该在哪里保存数据,在 parent 还是 child ?假设我在孩子做,我使用父保存功能来更新用户界面?

2- 如果我有一个没有绑定的子组件,在子组件中进行数据保存和操作是否正确?

3- 理想情况下,所有应用程序都应该是一个组件树。假设我有一个表单,称为使用 ng-view 和路由器。一般来说,我必须考虑一个代表整个应用程序用户界面的核心或父组件,例如,我的表单是一个子组件?所以我必须像第 1 点和第 2 点那样传播绑定?

希望我的问题很清楚

【问题讨论】:

在这种情况下,您可以使用 scope.$emit 和 scope.$on。处理这些情况的最佳方法。 当您使用组件和基于组件的架构时,使用范围是一种不好的做法 【参考方案1】:

为了解释这一点,我首先必须考虑一些可能会改变您对应用程序设计看法的组件。

组件

组件是对既是整体的一部分又由另一个整体组成的事物的通用定义,但它没有具体说明每个组件在该整体中的作用。因此,在基于组件的架构中,通常会定义指令来处理组件,从而更好地定义每个角色。

例如:一堆组件,一个由另一个组合但所有组件;

<component>    
    <component></component>
    <component>        
        <component></component>
        <component></component>        
    </component>    
</component>

智能组件和哑组件

我了解到大多数基于组件的框架和库都使用这种方法。组件分为两类,智能组件和哑组件。这个Tero Parviainen's article 和Dan Abramov 更好地描述了这一点。

例如:仍然,都是组件,但由其类别定义

<app>
    <nav></nav>
    <!-- projects-page is Dumb: I don't have to know nothing
    <!-- just organize and display things -->
    <projects-page>
        <!-- project-list is Smart: I must know how to retrieve projects -->
        <project-list>
            <!-- Dumb: just display -->
            <project-list-item></project-list-item>
            <!-- Dumb: just display -->     
            <project-list-item></project-list-item>
        </project-list>
    </projects-page>    
</app>

基本上,智能组件连接到应用程序逻辑,他们知道如何思考。虽然他们可能有输入和输出,但他们大多知道如何加载自己的数据,以及如何在发生更改时持久保存。但是 Dumb 组件只知道事物应该是什么样子,并且完全由它们的绑定定义:它们使用的所有数据都作为输入提供给它们,它们引入的每一个更改都作为输出输出,Toward Smart And Dumb Components, Tero Parviainen's .

回答

所以你的问题的答案是:这取决于你如何看待那个子表单组件,如果它只是一个显示字段的编辑器(即,愚蠢,我认为在这种情况下它是)。或者由检索和命令与持久性单元的通信来保存它(即智能)。

无论如何,最重要的是确保您保存的是来自智能组件的数据,最好是来自该数据的所有者。将智能组件视为管理者,将愚蠢组件视为生产者。另外,请查看这篇关于编写基于组件的应用程序的文章:Writing component based goats dating app with angular 1.5,由 Dima Grossman 撰写。

注意:将智能组件视为有状态的。这基本上意味着智能组件在某些情况下的可重用性较低。如果您必须在另一个组件上重用form-component,其中对象project 是另一个对象的一部分(例如 client: name: '', projects: [ id:1, ... ...]),并且您想使用相同的表单来编辑此对象中的项目,您将面临一个问题。你不能重用完全相同的组件逻辑,因此在这种情况下,一个愚蠢的组件对于重用可能更有用,因为它更简单、更客观,而且它不做任何决定,只是展示东西,接收和返回数据。

【讨论】:

谢谢。我了解基于组件的方法,我喜欢它。就我而言,这件事让我从效率和数据负载两方面考虑。即我有一个包含一些信息的列表视图和更多信息的表单,所以我正在决定方法。 @Massimo 是的,这是一个必须谨慎做出的决定。另外,在我的回答中添加了一个注释。

以上是关于AngularJs 1.5 - 基于组件的架构、绑定和良好实践的主要内容,如果未能解决你的问题,请参考以下文章

Angular 1.5 组件:基于组件的应用程序架构

angularjs 1.5 组件依赖注入

angularJS 1.5 嵌套组件

在 angularjs 1.5 组件中设置有效性

D3.js 4 与 AngularJS 1.5(组件或指令?)

requirejs 和 angularjs 1.5 注入 ui.router 组件失败