Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 2和Ionic 2:构造函数、IoninViewDidLoad和ngOnInit方法之间有什么区别_Angular_Ionic2 - Fatal编程技术网

Angular 2和Ionic 2:构造函数、IoninViewDidLoad和ngOnInit方法之间有什么区别

Angular 2和Ionic 2:构造函数、IoninViewDidLoad和ngOnInit方法之间有什么区别,angular,ionic2,Angular,Ionic2,构造函数、ionViewDidLoad和ngOnInit方法之间有什么区别。 在每种情况下,哪些操作是合适的。关于ionic2的构造函数:简单地说,我们使用它来创建插件、服务等的实例。例如:您有一个页面(视图),其中您要显示所有学生的列表,您有一个包含所有学生的json文件(此文件是您的数据文件)你要做的是在这个服务中创建一个服务,你将创建一个方法并点击一个http.get请求来获取json数据,那么这里你需要什么http只需这样做: import {Http} from '@angular/h

构造函数、ionViewDidLoad和ngOnInit方法之间有什么区别。
在每种情况下,哪些操作是合适的。

关于ionic2的
构造函数
:简单地说,我们使用它来创建插件、服务等的实例。例如:您有一个页面(视图),其中您要显示所有学生的列表,您有一个包含所有学生的json文件(此文件是您的数据文件)你要做的是在这个服务中创建一个服务,你将创建一个方法并点击一个
http.get
请求来获取json数据,那么这里你需要什么<代码>http只需这样做:

import {Http} from '@angular/http';
@Injectable()
export class StudentService{
    constructor(public http: Http){}
    getAllStudents(): Observable<Students[]>{
        return this.http.get('assets/students.json')
        .map(res => res.json().data)     
        }
    }
再次注意这里的构造函数,我们正在构造函数中创建StudentService的实例,还有一件事,我们正在使用SocialShareing插件,以便使用它,我们也在构造函数中创建StudentService的实例

OnInit
:这在ionic2或AngularJs2中确实是一件令人惊奇的事情。通过上面相同的示例,我们可以看到什么是
ngOnInit
。 因此,您已经准备好使用服务方法,现在在视图/页面中,您希望学生列表数据在视图即将出现时立即可用,这应该是加载时自动执行的第一个操作,因为在视图加载时,学生列表应该是可见的。因此,该类实现了
OnInit
,您可以定义
ngOnInit
。例如:

export class HomePage implements OnInit {
...
....
constructor(....){}

ngOnInit(){
    this._studentService.getAllStudents().subscribe(
     (students: Students[]) => this.students = students, 
    )
我希望这个解释能消除你对这两个问题的疑虑。
谢谢

尽管niks的回答确实指出了正确的生命周期事件触发顺序,但Angular团队

但是为了回答你的问题,
ionViewDidLoad()
ngOnInit()
应该在相同的时间运行,所以它们本质上是相同的;但是,
ionViewDidLoad()

如果页面离开但被缓存,则此事件将不会在上再次触发 随后的观看


因此,对于不希望缓存但希望在组件装入之前加载的任何内容,您应该使用
ionViewWillEnter()
,或者
ionViewWillLoad()
处理GET请求之类的内容

构造函数

构造函数
不是角度特性,它由Javascript引擎调用。虽然是用TypeScript编写的,但它是ES6概念,是类生命周期钩子的一部分。因此,了解Angular何时完成其组件的初始化不是一个好地方

它是进行依赖注入的正确地方

ngOnInit

ngOnInit是一个有角度的钩子。在Angular完成组件设置后执行。例如,这意味着此时将完成属性绑定

这是初始化组件的一些数据的好地方

ionViewDidLoad

ionViewDidLoad
是一个离子导航生命周期事件。爱奥尼亚有一个页面的概念。它有一些与导航逻辑相关的类,它的基类是NavController。它们有导航堆栈的概念,因此页面基本上是从堆栈中推送或弹出的。在此导航过程中,会触发ionViewDidLoad等生命周期事件

加载页面后,将调用ionViewDidLoad。默认情况下,页面是缓存的,这意味着如果不销毁,将不会再次触发此事件

考虑到这是一个放置页面设置代码的好地方

参考文献:


最佳实践包括:

仅对依赖项注入使用
构造函数

使用
ngOnInit
从静态数据或导航数据(通过NavParams)设置组件属性。模板可以使用由
ngOnInit
设置的属性,即不需要使用Elvis运算符
data?.prop
来检查空值。创建组件时仅调用一次

使用
ionViewDidLoad
仅设置一次属性,类似于
ngOniInit
。页面在创建时仅触发此事件一次。从缓存加载的页面(例如,在弹出顶部页面后加载页面)不会触发此事件。可以使用它来设置模式页面的属性,因为模式页面位于堆栈的顶部,并且没有缓存

每次输入页面时,使用
ionViewWillEnter
设置数据。与
ngOninit
ionViewDidLoad
不同,它甚至可以从缓存页面触发


对于
ionViewDidLoad
ionViewWillEnter
事件,呈现页面模板时不会初始化组件属性。在访问对象的成员之前,应该使用Elvis运算符检查对象的空值。

我不知道
ionViewDidLoad
,但ionViewDidLoad是一种离子方法,类似于angular2中的ngOnInit()。要了解更多信息,请准确查看。我猜这两个链接回答了你的问题。我也很想知道两者的区别,因为它们都在Ionic2应用程序中工作。我们不应该出于某种原因使用ngOnInit吗?@GabeO'Leary你可以使用任何你想要的,但是要保持一致。我建议您使用
ionViewDidLoad()
ionViewWillUnload()
代替angular的
ngOnInit()
ngOnDestroy()
。如果ionic中的生命周期事件不适合您的用例,请务必使用角度事件。
export class HomePage implements OnInit {
...
....
constructor(....){}

ngOnInit(){
    this._studentService.getAllStudents().subscribe(
     (students: Students[]) => this.students = students, 
    )