2016-08-23 59 views
1

我有一個頁面控制器,這裏簡化訪問父控制器n級更高

angular.module('app').controller('MyCtrl', function() { 
    this.name = 'David' 
}); 

我使用controllerAs語法在我的模板(MyCtrl爲主),所以我只是用main.name我模板來訪問該名稱。都好。

在我的模板中,我有一堆嵌套的指令,創建新的示波器和底部的某處我有一個ng = controller =「SubCtrl as subController」。我現在可以通過執行subcontroller.property來訪問子控制器上的屬性,並且在該模板中,我仍然可以訪問main.name,因爲controllerAs非常棒。

麻煩的是,在我的第二個控制器代碼中,我需要訪問父級控制器中的東西,這個東西在這個層次上是深度較深的。我知道我可以在主控制器做到這一點是這樣的...

$scope.main = this; 

,然後做這個第二控制器

var main = $scope.$parent.$parent.$parent.$parent.main; 

但我們都知道,我們不應該這樣做,我贏了無論如何,我不知道有多少層次的深度,因爲我不知道開發人員將多少個指令放在裏面,從而創建一個新的範圍。

我聽到一些人在討論爲此創建服務,但這聽起來像一般很難做到,而且我不希望我的框架的用戶在每次將包含內容時都必須創建服務一個標籤面板,這將是瘋狂的。

因此,我目前的想法是使用範圍並編寫一個函數,它將遍歷父範圍,直到找到使用比較函數指定的範圍。我覺得可能有更好的方法。

+0

誰會在不暴露問題的情況下投下一個問題?我認爲我解釋得很好,這是一個完全正確的問題。 – jonhobbs

+0

那麼爲什麼不創建一個服務?服務是存儲數據或訪問多個控制器,指令,工廠等所需內容的好地方。它基本上是一個單身人士,你在多個地方注入,但它始終是同一個實例注入。它非常易於使用,並且比您想到的更脆弱($ parent。$ parent.n ..... data)。如果你正在進行單元測試,它也是可測試的。 – Igor

+0

我一直在那裏,並且我向你保證,如果你想在控制器之間共享信息,沒有什麼比服務更好。例如:用於在用戶'infoService'上存儲信息的服務。 'mainCtrl'可以做'infoService.registerUser({name:'David'})'然後'subCtrl'可以做'infoService.getLatestUser()' – pavlag

回答

2

那麼爲什麼不創建一個服務?服務是存儲數據或訪問多個控制器,指令,工廠等所需內容的好地方。它基本上是一個單例,你在多個地方注入,但它始終是同一個實例注入,並且只在第一次需要時才創建。它比使用($parent.$parent.n.....data)更容易使用,並且不易碎。如果你正在進行單元測試,它也是可測試的。

var module = angular.module('app'); 

module.service('commonService', function() { 
    this.sharedData = {name: ''}; 
}); 

// assume this gets loaded first 
module.controller('MyCtrl1', ['commonService', function (commonService) { 
    commonService.sharedData.name = 'David' 
}]); 

// and this is loaded somewhere after MyCtrl2 
module.controller('MyCtrl2', ['commonService', function (commonService) { 
    var name = commonService.sharedData.name; 
}]); 

我還沒有驗證語法,但這是基本結構,很簡單。

+0

好的,每當我有一個盛大的父母>孩子的場景時(我的應用程序中有一個標籤系統的頁面),或者我能將它們全部存儲在服務中,我就需要這樣做。該服務可以具有鍵值對的映射,其中每個鍵是唯一的控制器名稱,每個值是對控制器實例的引用? – jonhobbs

+0

@jonhobbs - 服務只不過是一個只創建一次的對象,所以它可以包含任何你想要包括對控制器的引用。作爲一種OOP規則,雖然類型越少知道對方,程序就越靈活,所以總是推薦使用「鬆耦合」。我會將共同/共享狀態和共同/共享業務邏輯抽象爲一個或多個服務(如果沒有共享狀態,則爲工廠),這是控制器彼此「通信」的最佳方式。 – Igor

相關問題