Làm cách nào để chuyển dữ liệu đến các thành phần được định tuyến Angular?

290
dragonmnl 2016-04-25 22:10.

Trong một trong các mẫu của Angular 2 route ( FirstComponent ), tôi có một nút

first.component.html

<div class="button" click="routeWithData()">Pass data and route</div>

Mục tiêu của tôi là đạt được:

Nhấp vào nút -> định tuyến đến thành phần khác trong khi vẫn bảo toàn dữ liệu và không sử dụng thành phần khác làm chỉ thị.

Đây là những gì tôi đã thử ...

CÁCH TIẾP CẬN 1ST

Trong cùng một chế độ xem, tôi đang lưu trữ thu thập dữ liệu giống nhau dựa trên tương tác của người dùng.

first.component.ts

export class FirstComponent {
     constructor(private _router: Router) { }

     property1: number;
     property2: string;
     property3: TypeXY; // this a class, not a primitive type

    // here some class methods set the properties above

    // DOM events
    routeWithData(){
         // here route
    }
}

Thông thường, tôi định tuyến đến SecondComponent bằng

 this._router.navigate(['SecondComponent']);

cuối cùng chuyển dữ liệu bằng

 this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);

trong khi định nghĩa của liên kết với các tham số sẽ là

@RouteConfig([
      // ...
      { path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent} 
)]

Vấn đề với cách tiếp cận này là tôi đoán tôi không thể chuyển dữ liệu phức tạp (ví dụ: một đối tượng như property3) trong url;

CÁCH TIẾP CẬN THỨ 2

Một giải pháp thay thế sẽ bao gồm SecondComponent làm chỉ thị trong FirstComponent.

  <SecondComponent [p3]="property3"></SecondComponent>

Tuy nhiên tôi muốn định tuyến đến thành phần đó, không bao gồm nó!

CÁCH TIẾP CẬN 3RD

Giải pháp khả thi nhất mà tôi thấy ở đây là sử dụng Dịch vụ (ví dụ: FirstComponentService) để

  • lưu trữ dữ liệu (_firstComponentService.storeData ()) trên routeWithData () trong FirstComponent
  • lấy dữ liệu (_firstComponentService.retrieveData ()) trong ngOnInit () trong SecondComponent

Mặc dù cách tiếp cận này có vẻ hoàn toàn khả thi, nhưng tôi tự hỏi liệu đây có phải là cách dễ nhất / thanh lịch nhất để đạt được mục tiêu hay không.

Nói chung, tôi muốn biết liệu tôi có đang thiếu các phương pháp tiếp cận tiềm năng khác để truyền dữ liệu giữa các thành phần hay không, đặc biệt là với số lượng mã ít hơn có thể

16 answers

210
Günter Zöchbauer 2016-04-25 22:12.

cập nhật 4.0.0

Xem tài liệu Angular để biết thêm chi tiết https://angular.io/guide/router#fetch-data-before-navicting

nguyên

Sử dụng một dịch vụ là cách để đi. Trong các tham số định tuyến, bạn chỉ nên chuyển dữ liệu mà bạn muốn được phản ánh trong thanh URL của trình duyệt.

Xem thêm https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

Giới thiệu lại bộ định tuyến với RC.4 data

constructor(private route: ActivatedRoute) {}
const routes: RouterConfig = [
  {path: '', redirectTo: '/heroes', pathMatch : 'full'},
  {path : 'heroes', component : HeroDetailComponent, data : {some_data : 'some value'}}
];
class HeroDetailComponent {
  ngOnInit() {
    this.sub = this.route
      .data
      .subscribe(v => console.log(v));
  }

  ngOnDestroy() {
    this.sub.unsubscribe();
  }
}

Xem thêm Plunker tại https://github.com/angular/angular/issues/9757#issuecomment-229847781

70
Utpal Kumar Das 2016-09-19 23:39.

Tôi nghĩ vì chúng ta không có $ rootScope loại thứ trong góc 2 như trong góc 1.x. Chúng ta có thể sử dụng dịch vụ / lớp chia sẻ góc 2 trong khi ngOnDestroy truyền dữ liệu đến dịch vụ và sau khi định tuyến lấy dữ liệu từ dịch vụ trong hàm ngOnInit :

Ở đây tôi đang sử dụng DataService để chia sẻ đối tượng anh hùng:

import { Hero } from './hero';
export class DataService {
  public hero: Hero;
}

Chuyển đối tượng từ thành phần trang đầu tiên:

 ngOnDestroy() {
    this.dataService.hero = this.hero; 
 }

Lấy đối tượng từ thành phần trang thứ hai:

 ngOnInit() {
    this.hero = this.dataService.hero; 
 }

Đây là một ví dụ: plunker

35
Washington Soares Braga 2019-06-28 04:29.

Angular 7.2.0 giới thiệu cách mới để truyền dữ liệu khi điều hướng giữa các thành phần được định tuyến:

@Component({
  template: `<a (click)="navigateWithState()">Go</a>`,
})
export class AppComponent  {
  constructor(public router: Router) {}
  navigateWithState() {
    this.router.navigateByUrl('/123', { state: { hello: 'world' } });
  }
}

Hoặc là:

@Component({
  selector: 'my-app',
  template: `
  <a routerLink="/details" [state]="{ hello: 'world' }">Go</a>`,
})
export class AppComponent  {}

Để đọc trạng thái, bạn có thể truy cập thuộc window.history.statetính sau khi điều hướng kết thúc:

export class PageComponent implements OnInit {
  state$: Observable<object>;

  constructor(public activatedRoute: ActivatedRoute) {}

  ngOnInit() {
    this.state$ = this.activatedRoute.paramMap
      .pipe(map(() => window.history.state))
  }
}
33
Daniel Charles Mwangila 2018-09-07 04:02.
<div class="button" click="routeWithData()">Pass data and route</div>

cách dễ nhất để làm điều đó trong góc 6 hoặc các phiên bản khác, tôi hy vọng chỉ đơn giản là xác định đường dẫn của bạn với lượng dữ liệu bạn muốn chuyển

{path: 'detailView/:id', component: DetailedViewComponent}

như bạn có thể thấy từ định nghĩa các tuyến đường của tôi, tôi đã thêm /:idgiá trị vào dữ liệu tôi muốn chuyển tới thành phần thông qua điều hướng bộ định tuyến. Do đó mã của bạn sẽ giống như

<a class="btn btn-white-view" [routerLink]="[ '/detailView',list.id]">view</a>

để đọc idtrên các thành phần, chỉ cần nhập ActivatedRoute như

import { ActivatedRoute } from '@angular/router'

và trên đó ngOnInitlà nơi bạn lấy dữ liệu

ngOnInit() {
       this.sub = this.route.params.subscribe(params => {
        this.id = params['id'];
        });
        console.log(this.id);
      }

bạn có thể đọc thêm trong bài viết này https://www.tektutorialshub.com/angular-passing-parameters-to-route/

17
PeS 2019-11-12 01:29.

Bây giờ là năm 2019 và nhiều câu trả lời ở đây sẽ hoạt động, tùy thuộc vào những gì bạn muốn làm. Nếu bạn muốn truyền ở một số trạng thái bên trong không hiển thị trong URL (tham số, truy vấn), bạn có thể sử dụng statekể từ 7.2 (như tôi đã học hôm nay :)).

Từ blog (tín dụng Tomasz Kula) - bạn điều hướng đến tuyến đường ....

... từ ts: this.router.navigateByUrl('/details', { state: { hello: 'world' } });

... từ mẫu HTML: <a routerLink="/details" [state]="{ hello: 'world' }">Go</a>

Và để chọn nó trong thành phần mục tiêu:

constructor(public activatedRoute: ActivatedRoute) {}

  ngOnInit() {
    this.state$ = this.activatedRoute.paramMap
      .pipe(map(() => window.history.state))
  }

Muộn, nhưng hy vọng điều này sẽ giúp ai đó với Angular gần đây.

16
terary 2019-01-14 07:44.

Một người siêu thông minh nào đó (tmburnell) không phải là tôi gợi ý nên viết lại dữ liệu tuyến đường:

let route = this.router.config.find(r => r.path === '/path');
route.data = { entity: 'entity' };
this.router.navigateByUrl('/path');

Như đã thấy ở đây trong các ý kiến.

Tôi hy vọng ai đó sẽ thấy điều này hữu ích

12
AmirReza-Farahlagha 2019-01-07 22:11.

Tôi đây là cách tiếp cận khác không tốt cho vấn đề này. Tôi điều cách tiếp cận tốt nhất là Truy vấn-Tham số theo Routergóc có 2 cách:

Truyền trực tiếp tham số truy vấn

Với mã này, bạn có thể điều hướng đến urlbằng paramsmã html của mình:

<a [routerLink]="['customer-service']" [queryParams]="{ serviceId: 99 }"></a>

Chuyển tham số truy vấn bởi Router

Bạn phải đưa bộ định tuyến vào bên trong constructornhư sau:

constructor(private router:Router){

}

Bây giờ sử dụng nó như:

goToPage(pageNum) {
    this.router.navigate(['/product-list'], { queryParams: { serviceId: serviceId} });
}

Bây giờ nếu bạn muốn đọc từ Routertrong khác, Componentbạn phải sử dụng ActivatedRoutenhư sau:

constructor(private activateRouter:ActivatedRouter){

}

subscriberằng:

  ngOnInit() {
    this.sub = this.route
      .queryParams
      .subscribe(params => {
        // Defaults to 0 if no query param provided.
        this.page = +params['serviceId'] || 0;
      });
  }
7
scorpion 2018-09-21 10:02.

Giải pháp với ActiveRoute (nếu bạn muốn truyền đối tượng theo tuyến - hãy sử dụng JSON.stringfy / JSON.parse):

Chuẩn bị đối tượng trước khi gửi:

export class AdminUserListComponent {

  users : User[];

  constructor( private router : Router) { }

  modifyUser(i) {

    let navigationExtras: NavigationExtras = {
      queryParams: {
          "user": JSON.stringify(this.users[i])
      }
    };

    this.router.navigate(["admin/user/edit"],  navigationExtras);
  }

}

Nhận đối tượng của bạn trong thành phần đích:

export class AdminUserEditComponent  {

  userWithRole: UserWithRole;      

  constructor( private route: ActivatedRoute) {}

  ngOnInit(): void {
    super.ngOnInit();

      this.route.queryParams.subscribe(params => {
        this.userWithRole.user = JSON.parse(params["user"]);
      });
  }

}
6
Shashank Agrawal 2020-08-10 18:32.

Tôi đã xem xét mọi giải pháp (và đã thử một vài giải pháp) từ trang này nhưng tôi không tin rằng chúng ta phải triển khai một cách hack-ish để đạt được việc truyền dữ liệu giữa các tuyến đường.

Một vấn đề khác với đơn giản history.statelà nếu bạn đang truyền một thể hiện của một lớp cụ thể trong stateđối tượng, nó sẽ không phải là thể hiện khi nhận nó. Nhưng nó sẽ là một đối tượng JavaScript đơn giản.

Vì vậy, trong ứng dụng Angular v10 (Ionic v5), tôi đã làm điều này-

this.router.navigateByUrl('/authenticate/username', {
    state: {user: new User(), foo: 'bar'}
});

Và trong thành phần điều hướng ( '/authenticate/username'), trong ngOnInit()phương thức, tôi đã in dữ liệu với this.router.getCurrentNavigation().extras.state-

ngOnInit() {
    console.log('>>authenticate-username:41:',
        this.router.getCurrentNavigation().extras.state);
}

Và tôi đã nhận được dữ liệu mong muốn đã được thông qua-

5
ahankendi 2016-10-31 09:38.

Cách tiếp cận thứ 3 là cách phổ biến nhất để chia sẻ dữ liệu giữa các thành phần. bạn có thể đưa dịch vụ mục mà bạn muốn sử dụng vào thành phần liên quan.

import { Injectable } from '@angular/core';
import { Predicate } from '../interfaces'

import * as _ from 'lodash';

@Injectable()
export class ItemsService {

    constructor() { }


    removeItemFromArray<T>(array: Array<T>, item: any) {
        _.remove(array, function (current) {
            //console.log(current);
            return JSON.stringify(current) === JSON.stringify(item);
        });
    }

    removeItems<T>(array: Array<T>, predicate: Predicate<T>) {
        _.remove(array, predicate);
    }

    setItem<T>(array: Array<T>, predicate: Predicate<T>, item: T) {
        var _oldItem = _.find(array, predicate);
        if(_oldItem){
            var index = _.indexOf(array, _oldItem);
            array.splice(index, 1, item);
        } else {
            array.push(item);
        }
    }


    addItemToStart<T>(array: Array<T>, item: any) {
        array.splice(0, 0, item);
    }


    getPropertyValues<T, R>(array: Array<T>, property : string) : R
    {
        var result = _.map(array, property);
        return <R><any>result;
    }

    getSerialized<T>(arg: any): T {
        return <T>JSON.parse(JSON.stringify(arg));
    }
}



export interface Predicate<T> {
    (item: T): boolean
}
3
Noname 2018-06-19 14:06.

Vượt qua bằng JSON

  <a routerLink = "/link"
   [queryParams] = "{parameterName: objectToPass| json }">
         sample Link                   
  </a>
3
Amin Adel 2018-12-25 00:46.

sử dụng dịch vụ chia sẻ để lưu trữ dữ liệu với chỉ mục tùy chỉnh. sau đó gửi chỉ mục tùy chỉnh đó với queryParam. cách tiếp cận này linh hoạt hơn .

// component-a : typeScript :
constructor( private DataCollector: DataCollectorService ) {}

ngOnInit() {
    this.DataCollector['someDataIndex'] = data;
}

// component-a : html :
<a routerLink="/target-page" 
   [queryParams]="{index: 'someDataIndex'}"></a>

.

// component-b : typeScript :
public data;

constructor( private DataCollector: DataCollectorService ) {}

ngOnInit() {
    this.route.queryParams.subscribe(
        (queryParams: Params) => {
            this.data = this.DataCollector[queryParams['index']];
        }
    );
}
1
Nelson Bwogora 2019-05-14 08:31.

nói rằng bạn có

  1. component1.ts
  2. component1.html

và bạn muốn truyền dữ liệu cho component2.ts .

  • trong component1.ts là một biến với dữ liệu nói

      //component1.ts
      item={name:"Nelson", bankAccount:"1 million dollars"}
    
      //component1.html
       //the line routerLink="/meter-readings/{{item.meterReadingId}}" has nothing to 
      //do with this , replace that with the url you are navigating to
      <a
        mat-button
        [queryParams]="{ params: item | json}"
        routerLink="/meter-readings/{{item.meterReadingId}}"
        routerLinkActive="router-link-active">
        View
      </a>
    
      //component2.ts
      import { ActivatedRoute} from "@angular/router";
      import 'rxjs/add/operator/filter';
    
      /*class name etc and class boiler plate */
      data:any //will hold our final object that we passed 
      constructor(
      private route: ActivatedRoute,
      ) {}
    
     ngOnInit() {
    
     this.route.queryParams
      .filter(params => params.reading)
      .subscribe(params => {
      console.log(params); // DATA WILL BE A JSON STRING- WE PARSE TO GET BACK OUR 
                           //OBJECT
    
      this.data = JSON.parse(params.item) ;
    
      console.log(this.data,'PASSED DATA'); //Gives {name:"Nelson", bankAccount:"1 
                                            //million dollars"}
       });
      }
    
1
sushil suthar 2020-03-20 08:07.

Bạn có thể sử dụng BehaviorSubject để chia sẻ dữ liệu giữa các thành phần được định tuyến. Một BehaviorSubject có một giá trị. Khi nó được đăng ký, nó phát ra giá trị ngay lập tức. Chủ đề không có giá trị.

Trong dịch vụ.

@Injectable({
  providedIn: 'root'
})
export class CustomerReportService extends BaseService {
  reportFilter = new BehaviorSubject<ReportFilterVM>(null);
  constructor(private httpClient: HttpClient) { super(); }

  getCustomerBalanceDetails(reportFilter: ReportFilterVM): Observable<Array<CustomerBalanceDetailVM>> {
    return this.httpClient.post<Array<CustomerBalanceDetailVM>>(this.apiBaseURL + 'CustomerReport/CustomerBalanceDetail', reportFilter);
  }
}

Trong thành phần, bạn có thể đăng ký BehaviorSubject này.

this.reportService.reportFilter.subscribe(f => {
      if (f) {
        this.reportFilter = f;
      }
    });

Lưu ý: Chủ đề sẽ không hoạt động ở đây, Chỉ cần sử dụng Chủ đề Hành vi.

0
Jeff G. 2020-09-30 12:29.

Một giải pháp tốt là triển khai một phương thức Guard với canActivate. Trong trường hợp này, bạn có thể tìm nạp dữ liệu từ một api nhất định và cho phép người dùng truy cập thành phần được mô tả trong tệp định tuyến. Trong khi đó, người ta có thể đặt thuộc tính dữ liệu của đối tượng định tuyến và truy xuất nó trong thành phần.

Giả sử bạn có vấn đề định tuyến này:

const routes: Routes = [
    { path: "/:projectName", component: ProjectComponent, canActivate: [ProjectGuard] }
]`

trong hồ sơ bảo vệ của bạn, bạn có thể có:

canActivate(next: ActivatedRouteSnapshot,state: RouterStateSnapshot)
: Observable<boolean> | Promise<boolean> | boolean {
return this.myProjectService.getProject(projectNameFoundElsewhere).pipe(
  map((project) => {
    if (project) {
      next.data = project;
    }
    return !!project;
  }),
);

} '

Sau đó, trong thành phần của bạn

constructor(private route: ActivatedRoute) {
    this.route.data.subscribe((value) => (this.project = value));
}

Cách này hơi khác so với việc chuyển qua một dịch vụ vì dịch vụ giữ giá trị trong một behaviorSubject miễn là nó không được đặt. Chuyển qua bảo vệ tha làm cho dữ liệu có sẵn cho tuyến đường hiện tại. Tôi không kiểm tra xem các tuyến đường con cái có giữ dữ liệu hay không.

0
Ralf Hannuschka 2020-11-18 01:02.

Theo mặc định, tôi sẽ không sử dụng bảo vệ cho cái này vì tôi có thể vào tuyến đường hơn hay tôi có thể rời khỏi nó. Nó không phải là để chia sẻ dữ liệu giữa chúng.

Nếu bạn muốn tải dữ liệu trước khi chúng tôi nhập một tuyến đường, chỉ cần thêm một trình phân giải vào một trình này, đây cũng là một phần của Bộ định tuyến.

Như ví dụ rất cơ bản:

Người phân giải

import { Resolve, ActivatedRoute } from "@angular/router";
import { Observable } from "rxjs";
import { Injectable } from "@angular/core";
import { take } from "rxjs/operators";

@Injectable()
export class UserResolver implements Resolve<User> {

    constructor(
        private userService: UserService,
        private route: ActivatedRoute
    ) {}

    resolve(): Observable<firebase.User> {
        return this.route.params.pipe(
            switchMap((params) => this.userService.fetchUser(params.user_id)),
            take(1)
        );
    }
}

đặt vào bộ định tuyến:

RouterModule.forChild([
{
    path: "user/:user_id",
    component: MyUserDetailPage,
    resolve: {
        user: UserResolver
    }
  }
}]

lấy dữ liệu trong thành phần của chúng tôi

ngOnInit() {
    const user: firebase.User = this.activatedRoute.snapshot.data.user;
}

Nhược điểm của cách tiếp cận này là, anh ta sẽ nhập tuyến đường đầu tiên nếu anh ta không nhận được dữ liệu người dùng trước đó, điều này đảm bảo dữ liệu cho người dùng đã được tải và sẵn sàng khi bắt đầu thành phần, nhưng bạn sẽ ở lại trang cũ như lâu dữ liệu đã được tải (Đang tải hoạt ảnh)

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Đây là Tổng thống Trump đe dọa 'trợ cấp' xe điện của GM vì đóng cửa nhà máy

Đây là Tổng thống Trump đe dọa 'trợ cấp' xe điện của GM vì đóng cửa nhà máy

Trump và Giám đốc điều hành GM Mary Barra vào năm 2017. Kể từ khi tin tức nổ ra ngày hôm qua rằng General Motors đang cắt giảm việc làm ở Bắc Mỹ để chuẩn bị cho tương lai điện / xe tự hành / khủng khiếp có thể xảy ra của chúng tôi, gần như tất cả mọi người đã tự hỏi: Tổng thống Trump, người đã vận động tranh cử trên một nền tảng sẽ như thế nào của việc mang lại và duy trì việc làm ô tô của Mỹ, phải nói gì về điều này? Bây giờ chúng ta biết.

Bản vá lỗi tiếp theo của Fallout 76 sẽ mang lại một số bản sửa lỗi cần thiết

Bản vá lỗi tiếp theo của Fallout 76 sẽ mang lại một số bản sửa lỗi cần thiết

Bethesda cho biết ngày hôm nay trên Reddit, Fallout 76 sẽ có một bản vá lớn khác vào ngày 4 tháng 12, sẽ bắt đầu cố gắng khắc phục một số vấn đề lớn hơn của trò chơi. Ngoài ra, công ty cho biết họ có kế hoạch giao tiếp nhiều hơn trong tương lai về những gì nhóm Fallout 76 đang làm việc và khi nào các bản cập nhật mới cho trò chơi sẽ ra mắt.

Mạng lưới bệnh viện Công giáo sẽ không cho phép nhân viên phá thai tại phòng khám ngoài giờ làm việc

Mạng lưới bệnh viện Công giáo sẽ không cho phép nhân viên phá thai tại phòng khám ngoài giờ làm việc

Bạn có biết rằng một trong sáu bệnh nhân ở bệnh viện ở Hoa Kỳ được điều trị tại một cơ sở Công giáo? Và bạn có biết rằng quyền sở hữu của Công giáo hạn chế sâu sắc việc thiết lập các thủ tục y tế có thể được thực hiện trong các bệnh viện này, rõ ràng nhất là khi nói đến chăm sóc sức khỏe sinh sản? Bây giờ NPR báo cáo rằng sự gia tăng của các bệnh viện thuộc Công giáo đang gây khó khăn hơn cho các bác sĩ — những người bị cấm bởi các quy định do Hoa Kỳ viết.

Khói từ đám cháy rừng ở California đã đến tận thành phố New York

Khói từ đám cháy rừng ở California đã đến tận thành phố New York

Đường chân trời San Francisco bị che khuất bởi khói và khói mù do cháy rừng phía sau Đảo Alcatraz, Thứ Tư, ngày 14 tháng 11 năm 2018, ở San Francisco.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language