2016-10-04 64 views
1

我正在測試Ionic 2和Angular 2,並且對於訪問父視圖的屬性有疑問。訪問父視圖屬性的最佳方式(Ionic 2,Angular 2)

例如,我有一個測試應用程序,其中我的視圖是項目列表,當我單擊一個項目時,我輸入他們的詳細信息。很簡單,是吧?那麼,細節視圖已經有了編輯元素的函數,然後應用這些更改。

對於這一點,我用三種不同的方式:

  • 一種是通過對象引用,只是對其進行編輯,其中編輯它返回該列表中(我想這是非常最佳)
  • 之前典型的navCtrl.pop(),通過navParam將參數傳遞給函數「ionViewDidEnter()」,該函數在您回到視圖時執行,並在那裏過濾,以便執行您所需的任務。問題:它不起作用(可能是一個錯誤)。
  • 這裏談到的krakken:當除去的元件,這將無法工作,因爲我有將其從列表中刪除,按照實施例,具有典型的list.splice(指數,1);

我發現執行此兩種不同的方法:你可以通過新的視圖列表的引用,或可以從NavController訪問它,就像我在這裏做的:

remove(){ 
    let list = this.navCtrl._views[0].instance.list; 

    for(var i=0;i<list.length;i++){ 
     if(list[i].id === this.contact.id){ 
      list.splice(i,1); 
     } 
    } 
    this.navCtrl.pop(); 
    } 

在這裏,我有這個奇怪的技術的另一個例子,重用創建一個新的元素編輯觀點:

editContact(obj){ 
    if(this.onEdit){ 
     this.onEdit = false; 
     this.editBtnTxt = "Edit contact"; 
     if(this.onCreate){ 
      this.navCtrl._views[0].instance.list.push(this.contact); 
      this.navCtrl.pop(); 
     } 
    }else{ 
     this.editBtnTxt = 'Apply changes'; 
     this.onEdit = true; 

    } 
    } 

雖然這工作得很好,並沒有拋出任何錯誤,我想我只是有點幸運,因爲:你怎麼知道的你想訪問的視圖的索引,如果你不是這樣一個簡單的測試項目,有兩個視圖,每個例子?我想這種做事方式可能會有很多錯誤。

但是,因爲它的工作原理,它似乎比傳遞大量參數更優化,或使用localStorage作爲「全局」變量,我一直堅持這一點。

我想知道的是... 哪種方式是最優化的訪問父視圖屬性?

+1

做到這一點的最佳方法是不要做這件事。您應該改爲在組件之間共享數據並在需要推送時傳遞參數的服務。 – misha130

回答

2

您應該儘量避免訪問父視圖。

在孩子中使用@Output() s並在父母中使用(someEvent)綁定,並通知父母應該在模型上採取的操作。

如果它們不是直接的父親孩子(例如當孩子被路由器添加時)使用具有observables的共享服務。

+0

你可以添加這些東西的例子嗎?我還沒有聽說過@Output裝飾器,也不知道Ang2中的共享服務如何。 – Zerok

+0

https://angular.io/docs/ts/latest/cookbook/component-communication.html涵蓋了這兩個主題。它們是Angular2的基本構建塊 –