angular组件间共享数据的四种方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了angular组件间共享数据的四种方式相关的知识,希望对你有一定的参考价值。

参考技术A 组件间数据共享是angular必须要理解的基础概念,本文介绍四种不同的共享式。

这是最常用直观的数据共享方式。使用 @Input() 修饰符通过模板进行数据传递。

ViewChild 允许从一个组件注入到另一个,父组件可以访问子组件的参数和方法。但是,在视图初始化之前,该子项将不可用。这意味着我们需要实现AfterViewInit生命周期钩子来接收来自子生命周期的数据(这块我也不太理解)。

另外一种方式是通过在子组件里emit数据到父组件里。这种一般用在子组件进行按钮单击、表单提交或其他用户事件产生数据变化时触发的向父组件的数据共享。父组件需要建立一个函数来接收消息为变量赋值。
在下面的样例中我们定义一个带Output修饰符的messageEvent变量并实例化成一个emitter。然后创建一个名为sendMessage的函数调用emit事件发送消息数据。最后创建一个按钮触发这个函数。
父组件通过订阅(subscribe)到子组建的messageEvent输出,然后在子组件按下按钮后触发消息数据接收函数。

非直连组件间数据传值应该通过在共享服务层加入RxJS BeahaviorSubject。
在可以用RxJS其他Subject通过服务层共享数据时为什么要选择用BehaviorSubject?
1.订阅后会返回当前值 ,不需要调用 onnext
2.通过getValues()函数提取最后值做为raw data。
3.确保组件能收到最新的数据。
在以下服务中,创建一个私有BehaviorSubject提供消息数据。首先定义一个currentMessage变量存放observable数据流,然后创建一个组件里的函数来改变变量值。
父、子、兄弟组件在订阅后都会收到相同的变量值。把DataService注入到contructor中,然后订阅其中的currentMessage observable来接收信息。
组件中创建一个发送消息函数广播到其他组件中接收函数进行数据接收。

原文链接

Android的四种监听事件处理方式

大多数情况下,我在对Android的事件处理方式都是用的基于监听的事件处理方式。事件监听的处理模型,主要涉及如下三类对象:

  1. 事件源:事件发生的场所。通常是某个组件,例如按钮、窗口、菜单、item等
  2. 事件:指界面的组件上发生的特定事情(通常就是一次用户操作)。如果程序想要获取界面上组件所发生的事件的相关信息,一般通过事件的对象来获取。
  3. 事件监听器:负责监听事件源所发生的事件,并对各种事件做出的相应响应。

所谓的事件监听器,其实就是实现了特定接口的Java类的实例。在实际应用中,实现事件监听器主要有四种形式:

  1. 内部类作为事件监听器类:将事件监听器类定义成当前类的内部类。优点:①可以在当前类中复用该监听器类;②因为监听器是外部类的内部类,所以可以自由访问外部类的所有界面组件。
public class MainActivity extends Activity

    @Override
    public void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 获取应用程序中的bn按钮
        Button bn = (Button) findViewById(R.id.bn);
        // 为按钮绑定事件监听器
        bn.setOnClickListener(new MyClickListener()); 
    
    // 定义一个单击事件的监听器(使用内部类作为事件监听器类)
    class MyClickListener implements View.OnClickListener
    
        // 实现监听器类必须实现的方法,该方法将会作为事件处理器
        @Override
        public void onClick(View v)
        
            //准备intent对象
            Intent intent = new Intent(MainActivity.this,NextActivity.class);
            //启动下一个界面
            startActivity(intent );
        
    
  1. Activity本身作为事件监听器类:让Activity本身实现监听器接口,并实现事件处理方法。缺点:可能造成程序结构混乱,Activity的主要职责应该是完成界面的初始化工作,但此时还要包含事件处理器方法,从而引起混乱
// 实现事件监听器接口
public class MainActivity extends Activity
        implements View.OnClickListener

    EditText show;
    Button bn;
    @Override
    public void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        show = (EditText) findViewById(R.id.show);
        bn = (Button) findViewById(R.id.bn);
        // 直接使用Activity作为事件监听器
        bn.setOnClickListener(this);
    
    // 实现事件处理方法
    @Override
    public void onClick(View v)
    
        //准备intent对象
        Intent intent = new Intent(this,NextActivity.class);
        //启动下一个界面
        startActivity(intent );
    
  1. 匿名内部类作为事件监听器类:使用匿名内部类创建事件监听器对象
public class MainActivity extends Activity

    Button bn;
    @Override
    public void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        bn = (Button) findViewById(R.id.bn);
        // 使用匿名内部类的实例作为事件监听器
        bn.setOnClickListener(new OnClickListener()
        
            // 实现事件处理方法:当点击按钮时,跳转到下一个界面
            @Override
            public void onClick(View v)
            
                //准备intent对象
                Intent intent = new Intent(MainActivity.this,NextActivity.class);
                //启动下一个界面
                startActivity(intent );
            
        );
    
  1. 外部类作为事件监听器类:将事件监听器类定义成一个外部类。比较少见,基本不用。

    通过上面是几个例子可以看出,基于监听的事件处理模型的编程步骤如下:
    ①获取界面组件(事件源),也就是被监听的对象。(findViewById())
    ②实现事件监听器类,该监听器类是一个特殊的Java类,必须实现一个XxxListener接口。
    ③调用事件源的setXxxListener方法将事件监听器对象注册给组件(事件源)。
    当事件源上发生指定事件时,Android会触发事件监听器,由事件监听器调用相应的方法来处理事件。

以上是关于angular组件间共享数据的四种方式的主要内容,如果未能解决你的问题,请参考以下文章

linux 实现共享内存同步

进程间通信方式

Android 数据的四种存储方式

Vue3组件(18)组件间传值/共享的方法的汇总

Angular组件通信和指令的使用

Java线程同步的四种方式详解