【问题标题】:Cache custom component content in ionic 2在 ionic 2 中缓存自定义组件内容
【发布时间】:2016-03-14 12:25:10
【问题描述】:

我正在创建一个从远程源加载 innerHTML 的自定义组件。我的问题是如何在应用加载时加载内容。现在,内容会在页面显示时加载,并且在文本出现之前会有一点延迟。是否有我可以附加到该组件以在应用加载时加载内容的事件?

这是我的组件的样子:

import {Component} from 'angular2/core'
import {DataProvider} from '../../providers/DataProvider'

@Component({

    'selector': 'ck-tos',
    templateUrl: 'build/directives/ckTos/ckTos.html',
    providers: [[Cashklick]],
})

export class ckTos {

    content: String = "";

    constructor(private DataProvider: DataProvider) {

        DataProvider.load('pages', 'terms').subscribe(
            data => {

                let response = data.json();
                if (response.content)
                    this.content = response.content;
                else if (response.error)
                    this.content = response.error;
                else
                    this.content = "Error: Unable to get any data ...";

            },
            err => {this.content = "Error: Unable to get any data ...";},
            () => console.log('DataProvider service for page terms completed')
        );
    }

}

当我打开应用程序时,我希望该组件加载和使用内容变量,而无需在每次呈现组件时调用远程服务。

【问题讨论】:

    标签: javascript angular ionic2


    【解决方案1】:

    您可以在您的服务中实现以下机制:

    export class DataProvider {
      constructor(private http:Http) {
      }
    
      load() {
        if (this.data) {
          return Observable.of(this.data);
        } else {
          return this.http.get(...)
                     .map(...)
                     .do(data => {
                       this.data = data;
                     });
      }
    }
    

    您需要为整个应用程序共享您的服务:

    bootstrap(AppComponent, [ DataProvider ]);
    

    注意不要在组件的providers 属性中指定DataProvider。

    【讨论】:

    • 它需要在组件级别实现,因为 DataProvider 在多个位置使用并且它加载不同的数据,我不想缓存它。
    • 好的!有道理!你为你的组件使用路由吗?
    • 我正在使用 ionic 2,而且我对这两种方法都很陌生,我在 ionic 2 演示应用程序和文档中没有看到 bootstrap() 声明。你知道我怎样才能在 Ionic 2 上在全球范围内提供这项服务吗?我没有在 ionic 2 中使用路由。
    • 所以使用主组件的providers 属性。由于分层注入器,它将与其他组件共享...
    • 您可以做一些事情,因为每次使用组件时都会实例化它们。 @Günter 的解决方案允许您保留相同的实例,但它仅适用于路由...@CanActivate 也可能是您正在寻找的,但它也在路由的上下文中。在您的情况下,唯一的方法是将我的解决方案与@Günter 在此问题中提出的建议混合使用...(如果您想要这样:“每次呈现组件时都无需调用远程服务”)
    【解决方案2】:

    您可以实现canReuse() https://angular.io/docs/ts/latest/api/router/CanReuse-interface.html,这样在离开和返回同一组件时不会重新创建组件实例

    或者您可以将该代码移至服务(可能移至DataProvider 或不依赖于DataProvider 的其他服务)并注入该服务。服务实例将由 DI 保持活动状态,包括数据。

    【讨论】:

    • 重用听起来不错,但是当整个应用程序加载时我如何加载它?现在,当我导航到 html 中存在该组件的页面时,它会加载。
    • 你保持原样。当您稍后导航回组件时,一切都应该与离开时一样(不再调用构造函数)。
    • 在 Ionic 2 中,您知道我需要导入什么才能使 CanReuse、OnReuse 工作吗?现在我得到:找不到名称'OnReuse'。
    • 我不知道 Ionic。在 TS 中,它是来自 angular2/router 的 OnReuse。如果 Ionic 不支持此功能,只需将方法 routerCanReuse(next: ComponentInstruction, prev: ComponentInstruction) { return true; } 添加到您的组件即可。 (您也可以从参数中删除类型,因此您也不需要导入它们。另请参阅此示例 github.com/angular/angular/blob/… 和 routerOnReuse(),以便您可以在重用时进行一些额外的初始化。
    • 我认为这不起作用,我能够实现它们,但它们从不触发。我猜这是因为 Ionic 2 没有使用路由,它使用导航组件来移动到页面。
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2017-07-03
    • 2017-09-14
    • 2017-04-12
    相关资源
    最近更新 更多