2017-05-11 34 views
0

服務工作正常 SharedService行爲對象未在角2

@Injectable() 
export class SharedService { 
    public userData: BehaviorSubject<IUserData> = new BehaviorSubject<IUserData>({ 
     /*user: <IUserVM>{ 
      identityId: '-', 
      imgSrc: 'public/assets/img/user_sm.png', 
      name: '-' 
     },*/ 
     accountList: [], 
     selectedAccount: <IAccountVM>{} 
     //sessionValid: false 
    }); 

    updateUserData(data: IUserData){ 
     this.userData.next(data); 

    } 


    public toggleSidebar: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false); 

    updateToggleSidebar(data: boolean){ 
     this.toggleSidebar.next(data); 
    } 

} 

這個服務被用於共享和更新數據

app.component.html

 <li *ngFor="let item of membershipList" (click)="switchAcc(item);" [ngClass]="{'active': item.id === selectedAccount.id}"> 
        <a><img [src]="item.imageUrl" id="{{item.id}}"></a> 
       </li> 
       <li><button class="btn btn btn-quiet-outline add-team-btn"> + </button></li> 
      </ul> 

app.component.ts

switchAcc(item?: IMembership) { 
    // this.sharedService.userData.value.selectedAccount = item; 
    var userData = { 
     "accountList": this.membershipList, 
     "selectedAccount": item 
    }; 
    this.sharedService.updateUserData(userData); 
    console.log("userData", userData); 
    if (item.type.toLowerCase() == 'personal') { 

     this.router.navigate(['/app/teams/' +item.id + '/dashboard/personal']); 
    } else { 
     this.router.navigate(['/app/teams/' + item.id + '/dashboard/business']); 
    } 
    $('.row-offcanvas').toggleClass('active'); 

} 

business.dashboard.component.ts

constructor(public sharedService: SharedService, private activateroute: ActivatedRoute) { 

    this.sharedService.userData.subscribe(value => { 
     console.log("value",value) 
     this.selectedAccount = value.selectedAccount; 
     this.accountList = value.accountList; 
     console.log("selectedAccount",value.selectedAccount.name); 
    }); 
} 

business.dashboard.component.ts是我嘗試獲得更新的價值,但價值得到更新的頁面,但它並沒有在HTML反映,當我嘗試控制檯(this.selectdaccount)它保留prevoius值沒有更新值

而當我雙擊鏈接app.component.html它工作完美我認爲問題在第一次它得到更新,然後聽取更新的值

+1

你在哪裏提供您'SharedService'你的組件? – echonax

+0

在共享文件夾服務中,但switchAcc是一種訪問共享服務和更新數據的功能。 –

+0

您可以共享您提供此服務的代碼,並且可以添加組件的@Component註釋嗎? – echonax

回答

2

嘗試觸發變化檢測手動

import { ChangeDetectorRef } from '@angular/core' 

@Component({...}) 
export class .. 
    constructor(private cdr: ChangeDetectorRef, public sharedService: SharedService, private activateroute: ActivatedRoute){..} 

    this.sharedService.userData.subscribe(value => { 
     console.log("value",value) 
     this.selectedAccount = value.selectedAccount; 
     this.accountList = value.accountList; 
     console.log("selectedAccount",value.selectedAccount.name); 
     this.cdr.detectChanges(); 
    }); 
+0

thanx @echonax ..實際上我發現錯誤,因爲另一個組件正在更新的值,所以導致衝突,所以它得到第一次更新的值不是第二次更新值..解決方案是防止從另一個組件更新,並確保只有一個組件將更新價值和其他只是聽那個價值 –

+0

@ UmeshShende啊很高興你明白了:-)你可以回答你自己的問題,並接受它作爲解決問題的答案。 – echonax