2017-08-18 183 views
-2

如何正確訪問formBuilder中的this.existingUsers?現在console.log(value)不顯示在控制檯中。 console.log(this.id)返回正確的參數。Angular 2 - 訪問訂閱值

export class UserComponent implements OnInit { 

    existingUser: any = {}; 

     ngOnInit() { 

     this.activatedRoute.params.subscribe((params: Params) => { 
      this.id = params['id']; 
      console.log(this.id); 
      this.db.object(`/users/${this.id}`).map(value => { 
      console.log(value); 
      this.existingUser = value; 
      }) 
     }); 

     console.log(this.existingUser); 

     this.userForm = this.formBuilder.group({ 
      first_name: [this.existingUser.first_name, Validators.required], 
     }) 
     }; 

} 
+0

你不顯示什麼'this.db.object'可能是,但你永遠不'subscribe'什麼返回。另外你似乎認爲'existingUser'會以某種方式在後續行中可用 - 如果是這種情況,*你不需要可觀察的*。 – jonrsharpe

+0

[如何從異步回調函數返回值?](https://stackoverflow.com/questions/6847697/how-to-return-value-from-an-asynchronous-callback-function) –

回答

0

我並不完全清楚你正在嘗試做什麼......但你可能需要.map方法中的代碼。就像這樣:

export class UserComponent implements OnInit { 

    existingUser: any = {}; 

    ngOnInit() { 

    this.activatedRoute.params.subscribe((params: Params) => { 
     this.id = params['id']; 
     console.log(this.id); 
     this.db.object(`/users/${this.id}`).map(value => { 
     console.log(value); 
     this.existingUser = value; 
     console.log(this.existingUser); 

     this.userForm = this.formBuilder.group({ 
      first_name: [this.existingUser.first_name, Validators.required], 
     }) 
     }) 
    }); 

    }; 

}

或者把這些代碼在一個被從這裏調用的方法。

更新:這是我的應用程序,做類似的例子:

ngOnInit(): void { 
    this.productForm = this.fb.group({ 
     productName: ['', [Validators.required, 
          Validators.minLength(3), 
          Validators.maxLength(50)]], 
     productCode: ['', Validators.required], 
     starRating: ['', NumberValidators.range(1, 5)], 
     tags: this.fb.array([]), 
     description: '' 
    }); 

    // Read the product Id from the route parameter 
    this.route.params.subscribe(
     params => { 
      let id = +params['id']; 
      this.getProduct(id); 
     } 
    ); 
} 

getProduct(id: number): void { 
    this.productService.getProduct(id) 
     .subscribe(
      (product: IProduct) => this.onProductRetrieved(product), 
      (error: any) => this.errorMessage = <any>error 
     ); 
} 

onProductRetrieved(product: IProduct): void { 
    if (this.productForm) { 
     this.productForm.reset(); 
    } 
    this.product = product; 

    if (this.product.id === 0) { 
     this.pageTitle = 'Add Product'; 
    } else { 
     this.pageTitle = `Edit Product: ${this.product.productName}`; 
    } 

    // Update the data on the form 
    this.productForm.patchValue({ 
     productName: this.product.productName, 
     productCode: this.product.productCode, 
     starRating: this.product.starRating, 
     description: this.product.description 
    }); 
    this.productForm.setControl('tags', this.fb.array(this.product.tags || [])); 
} 

您可以找到全套的代碼在這裏:https://github.com/DeborahK/Angular2-ReactiveForms(在APM文件夾)

+0

I' m試圖使用相同的組件來創建/更新用戶。這就是爲什麼我訂閱this.activatedRoute.params。我忽略瞭如果在我的問題。如果this.id不是create,並且如果this.db.object(/ users/$ {this.id})返回一個用戶,則表單將填充用戶的信息 – Ciprian

+0

然後所有這些邏輯都可以進入方法例如在'this.existingUser = value'語句之後調用。 – DeborahK

+0

如果您想查看完整的創建,更新,刪除,讀取(CRUD)的代碼示例,我有一個完整的示例應用程序在這裏:https://github.com/DeborahK/Angular2-ReactiveForms(在APM文件夾中) – DeborahK

-2

您正在嘗試在設置數據之前獲取asynchronous數據。

當某些內容異步時,它將在將來運行,並且訂閱是異步的。

訂閱功能中的所有內容在ngOnInit已完成後運行。這意味着,在existing_user被設置之前,您正在嘗試訪問first_name

請嘗試移動this.userForm東西到訂閱功能如下:

this.activatedRoute.params.subscribe((params: Params) => { 
     this.id = params['id']; 
     console.log(this.id); 
     this.db.object(`/users/${this.id}`).map(value => { 
     console.log(value); 
     this.existingUser = value; 
     }) 
     console.log(this.existingUser); 

     this.userForm = this.formBuilder.group({ 
     first_name: [this.existingUser.first_name, Validators.required], 
     }) 
    });