首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用相似路径时,如何在角2中将数据推入阵列

在使用相似路径时,如何在角2中将数据推入阵列
EN

Stack Overflow用户
提问于 2017-09-09 16:02:23
回答 2查看 1.1K关注 0票数 5

到目前为止,我还没有找到一个简单的例子来说明如何在角2中将数据推入数组。在AngularJs中,这是很容易的(示例),但我在第二个角度上为它而奋斗,可能是因为我使用路由器,我不知道如何配置它(我遵循的是角英雄榜样)。

我想做的是,整个解决方案:

app.module.ts:

代码语言:javascript
复制
import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { FormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';
import { LocationStrategy, HashLocationStrategy } from '@angular/common';
import { HttpModule } from '@angular/http';
import { ProductsService } from '../services/ProductsService';


import { AppComponent } from "./components/app";
import { Products } from "./components/products";

@NgModule({
    imports: [
        BrowserModule,
        FormsModule,
        HttpModule,
        RouterModule.forRoot([
            {
                path: 'products/:class_id/:type_id',
                component: Products
            }
        ], { useHash: true })
    ],
    exports: [RouterModule],
    declarations: [
        AppComponent
        Products
    ],
    providers: [
        ProductsService
    ],
    bootstrap: [AppComponent]
})
export class AppModule { }

AppComponent.ts

代码语言:javascript
复制
import { Component} from "@angular/core";

@Component({
    selector: "my-app",
    template: `<div>
                <a [routerLink]="['/products', 1, 1]">Products-1</a>
                <a [routerLink]="['/products', 2, 2]">Products-2</a>
               </div>`
})
export class AppComponent{}

ProductsService.ts

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { Headers, Http } from '@angular/http';
import 'rxjs/add/operator/toPromise';

@Injectable()
export class ProductsService {

    private headers = new Headers({ 'Content-Type': 'application/json' });

    constructor(private http: Http) { }

    getProducts(class_id: string, type_id: string, index: number, numberOfObjectsPerPage: number): Promise<any> {
        return this.http.get('Home/GetProducts?pageIndex=' + index +'&classId=' + class_id + '&typeId=' + type_id)
            .toPromise()
            .then(response => response.json() as any)
            .catch(this.handleError);
    }

    private handleError(error: any): Promise<any> {
        console.error('An error occurred', error); // for demo purposes only
        return Promise.reject(error.message || error);
    }
}

Product.ts

代码语言:javascript
复制
import 'rxjs/add/operator/switchMap';
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, ParamMap } from '@angular/router';
import * as $ from 'jquery';

import { ProductsService } from '../../services/ProductsService';
import { Product } from '../../common/models/Product';

@Component({
    selector: 'products',
    templateUrl: 'Products.html',
})
export class Products implements OnInit {
    products: Array<Product> = [];
    numberOfObjectsPerPage: number = 10;
    index: number = 0;
    constructor(
        private productsService: ProductsService,
        private route: ActivatedRoute
    ) {}

    ngOnInit(): void {
        this.loadProducts();
    }

    loadProducts():void{
        this.route.paramMap
            .switchMap((params: ParamMap) =>
                this.productsService.getProducts(params.get('class_id'), params.get('type_id'), this.index, this.numberOfObjectsPerPage))
            .subscribe(products => {
                this.products = products;
        });
    }

    showMore():void{
        this.index++;
        this.loadProducts();
    }
}

Products.html:

代码语言:javascript
复制
<div class="product" *ngFor="let product of products;">
  {{ product.name }}
</div>
<button (click)="showMore()">Show more</button>

那么,这里的问题是什么:如果我去Products-1,我会得到10个产品,这是显而易见的,但是如果我按下Show more,那么前10个产品就会被删除,另外10个产品也会显示出来--这也很明显,因此为了避免这一点,保留前10个并加载10个,我将Product.ts -> this.products = products;替换为:

代码语言:javascript
复制
 for (let i = 0; i < products.length; i++) {
  this.products.push(products[i]);
 }

现在出现了另一个问题:当我进入Product-2时,Products-1的产品将与Product-2的产品一起显示,因此为了避免这种情况,我在Product.ts constructor:中添加了这两行

代码语言:javascript
复制
constructor(private productsService: ProductsService, private route: ActivatedRoute) {
        route.paramMap.subscribe(params => this.products = []);
        route.paramMap.subscribe(params => this.index = 0);
}

现在,除了:当我从Products-1转到Products-2并加载更多的产品,并且在返回到Products-1之后,我可以在网络选项卡中看到多个相同类型的请求被发送到我的服务器。

所以我的问题是:

  1. 是否有更好的方法在使用路由时推送数据,并避免重置构造函数中的参数?
  2. 如果推入数组是可以的,如果可以重置构造函数中的参数,那么在从一个路由转到另一个路径时,如何避免多个请求?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-16 21:03:11

我要在product.ts**:**中添加/更改中的几个东西

  1. 将这些属性添加到您的index: number = 0; property:class_id: string;type_id: string下;
  2. route.paramMap.subscribe中删除constructor
  3. ngOnInit,应该如下所示: ngOnInit():void { this.route.paramMap.subscribe(params => { this.products = [];this.index = 0;this.type_id = params.get('type_id');this.class_id = params.get('class_id');this.loadProducts();})
  4. 最后,loadProducts() loadProducts():void {loadProducts this.type_id,this.index,this.numberOfObjectsPerPage).then( productArray => { this.products = this.products.concat(productArray);}}
票数 5
EN

Stack Overflow用户

发布于 2017-09-09 16:20:45

Product.ts

代码语言:javascript
复制
   import 'rxjs/add/operator/switchMap';
    import { Component, OnInit, OnDestroy } from '@angular/core';
    import { ActivatedRoute, ParamMap } from '@angular/router';
    import * as $ from 'jquery';

    import { ProductsService } from '../../services/ProductsService';
    import { Product } from '../../common/models/Product';

    @Component({
        selector: 'products',
        templateUrl: 'Products.html',
    })
    export class Products implements OnInit, OnDestroy {
        subscribe:any;
        products: Array<Product> = [];
        numberOfObjectsPerPage: number = 10;
        index: number = 0;
        constructor(
            private productsService: ProductsService,
            private route: ActivatedRoute
        ) {}

        ngOnInit(): void {
            this.loadProducts();
        }

        loadProducts():void{
            this.subscribe=this.route.paramMap
                .switchMap((params: ParamMap) =>
                    this.productsService.getProducts(params.get('class_id'), params.get('type_id'), this.index, this.numberOfObjectsPerPage))
                .subscribe(products => {
                    this.products = this.products.concat(products);
            });
        }

        showMore():void{
            this.index++;
            this.loadProducts();
        }
        ngOnDestroy():void{
            this.subscribe.unsubscribe();
}

    }

主要采用不描述方法;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46132499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档