当前位置: 首页 > 知识库问答 >
问题:

想要停止重新创建组件并在Angular2中保存组件数据

农诚
2023-03-14

这是我的服务

@Injectable()
export class JSTreeService {

  constructor(private http: Http) {

  }
  // Uses http.get() to load a single JSON file
  getData(): Observable<IDataItem[]> {
    return this.http.get('url')
      .map((res: Response) => res.json());

  }


}

这是我的主要组件,我订阅了服务并将其传递给另一个服务,以将其传递到其他组件

@Component({
  selector: 'app',
  pipes: [],
  providers: [JSTreeService, HTTP_PROVIDERS, SharedData],
  directives: [],
  encapsulation: ViewEncapsulation.None,

  template: `
    <header>
      <md-toolbar color="primary">
        <span>{{ name }}</span>
        <nav>
          <ul>
            <li router-active>
              <a [routerLink]=" ['Index'] ">Index</a>
            </li>
            |
            <li router-active>
              <a [routerLink]=" ['Home'] ">Home</a>
            </li>
            |
            <li router-active>
              <a [routerLink]=" ['About'] ">About</a>
            </li>
            |
            <li router-active>
              <a [routerLink]=" ['Items'] ">Items</a>
            </li>
          </ul>
        </nav>
      </md-toolbar>
    </header>
    <md-progress-bar mode="indeterminate" color="primary" *ngIf="loading"></md-progress-bar>

    <main>
      <router-outlet></router-outlet>
    </main>


})
@RouteConfig([
  { path: '/', name: 'Index', component: Home, useAsDefault: true },
  { path: '/home', name: 'Home', component: Home },


  { path: '/item', name: 'Items', component: ItemComponent },
  // Async load a component using Webpack's require with es6-promise-loader and webpack `require`
  { path: '/about', name: 'About', loader: () => require('es6-promise!./about')('About') }
])
export class App {

  dataItem: IDataItem[];

  // @Input() flag
  constructor(
    public appState: AppState,
    private _itemData: JSTreeService,
    private _sharedData: SharedData) {

  }
  getData() {
    this._itemData.getData()
      .subscribe(
      // the first argument is a function which runs on success
      (data: IDataItem[]) => {
        this.dataItem = data;
      },
      // the second argument is a function which runs on error
      err => console.error(err),
      // the third argument is a function which runs on completion
      () => (this._sharedData.dataItem = this.dataItem)

      );

    this.flag = 1;
  }

  ngOnInit() {
    console.log('Initial App State', this.appState.state);
    console.log('hello `Item` component');
    this.getData();
  }

}

这是我的路线组件

@Component({
  selector: 'Item',
  template: require('./item.html'),
  providers: [
  ]
})
export class ItemComponent  {
  dataItem: IDataItem[];
  flag: number;

  constructor(private _sharedData: SharedData) {

  }

  ngOnInit() {
    // console.log(this.dataItem);
    this.dataItem = this._sharedData.dataItem;

  }

  ngOnDestroy() {
    // this.dataItem = this._sharedData.dataItem;
  }
}

这是共享服务

@Injectable()
export class SharedData {
  constructor() {

  }
  dataItem:IDataItem[];


}

这是我的item.template

<div class="">
  <label *ngFor="let item of dataItem"> <input type="checkbox" name="checkbox" value="value"> {{item.text}} <br></label>
</div>

我可以成功地将数据从 appcomponent 传递到 'ItemComponent'。因此,每当我加载我的应用程序时,它都会订阅http调用并将数据传递给SharedService。当我单击 Item 时,它会路由到 ItemComponent,它会显示数据。现在我的问题是每次我路由到 Item 时,每次它都会重新创建 ItemComponent,这样我的数据就会消失。我不想要它。我想存储该组件的状态。这是在组件之间传递数据的好方法吗?我是Angular2的新手,任何类型的帮助都会受到赞赏:)我的更新项目组件 :

@Component({
  selector: 'Item',
  template: require('./item.html'),
  providers: [
    // JSTreeService,

  ]
})
export class ItemComponent implements CanReuse, OnReuse {
  dataItem: IDataItem[];
  flag: number;

  constructor(private _sharedData: SharedData) {
    // this.dataItem = params.get('dataitems');


  }

  ngOnInit() {
    // console.log(this.dataItem);
    this.dataItem = this._sharedData.dataItem;

  }
  routerCanReuse(next: ComponentInstruction, prev: ComponentInstruction) {


    return true;
  }
  routerOnReuse(next: ComponentInstruction, prev: ComponentInstruction) {
    //  this.name = next.params['name'];
    this.dataItem = this._sharedData.dataItem;
    console.log(this.dataItem);
  }
  ngOnDestroy() {
    // this.dataItem = this._sharedData.dataItem;
  }
}

是的,我正在使用从webpackstarter工具包中剥离的@angular/路由器

共有1个答案

公西运良
2023-03-14

将数据保留在服务中,并在重新创建组件时(使用此组件路由回路由时)从那里获取数据

routerCanReuse(nextInstruction: ComponentInstruction, prevInstruction: ComponentInstruction) : boolean |
<boolean> {
  return true; 
}

这在新的< code>RC.1路由器中尚未实现。

 类似资料:
  • 我一直在使用这个留档(我在网上唯一能找到的)来构建一个组件:http://docs.joomla.org/Developing_a_Model-View-Controller_Component/2.5/Introduction 我可以在一定程度上理解它,但它确实缺乏任何定义。我创建的组件在一定程度上工作正常,尽管我有一些更严重的问题。 基本上,我需要组件做的只是加载一个设置区域来设置一些值,并通

  • 我有一个对象,如下所示: 我想过滤并创建一个满足任何条件的新数组。例如:过滤器的名称为“AD”,并创建一个新的密钥数组,如下所示: 尝试地图 尝试过了。过滤器: 提前谢谢

  • Hyperf 官方提供了工具来快速创建组件包。 # 创建适配 Hyperf 最新版本的组件包 composer create-project hyperf/component-creater your_component dev-master # 创建适配 Hyperf 1.1 版本的组件包 composer create-project hyperf/component-creater you

  • 我有一个现有的数组,如下所示 然后我想创建一个新的数组,如下所示 我已经通过方法尝试过了 但是它没有给出一个正确的数组,请帮助我解决这个问题

  • 从 /core 引入 Component 装饰器 在 中 ,设置selector、template 和 styles 等元数据 template (模板):HTML的一种形式,它告诉Angular如何呈现这个组件。下面的组件会将name变量的值插入到双括号之间的模板中,在视图中呈现的是。 要使用这个组件,我们只需添加到我们的HTML,Angular将插入这些标签之间的视图的实例。 查看示例

  • 寻找一种方法,使服务在必要时将最新数据提供给订阅的组件。例如:组件 3 将更改写入 API 以下是一些片段和一些描述,说明到目前为止我所做的工作: 该服务通过HTTP从API获取数据。组件1和组件2订阅了服务返回的observable: