2014-02-19 35 views
3

我有2個控制器:一個用於菜單(我們可以添加/刪除元素的動態列表),另一個用於ng視圖。如何從模板訪問Angular服務對象?

我需要從ng-view控制器訪問菜單元素。所以,據我所知,我應該創建服務,以便菜單對象可以在任何控制器中使用,我只需要注入它。

完成。

但是!

我需要渲染這些對象。那麼,我應該把菜單元素放在兩個控制器的範圍之內?這很醜陋:每次更新服務中的元素時,我都應該更新它的值。該死的。

因此,它目前與rootScope和服務,它具有處理元素列表更新/添加/刪除AJAX的方法。但我認爲這裏有些不對勁。

任何建議?

+0

你可以使用Angular'value'並將其注入到兩者中。我也剛剛爲範圍屬性分配了一個服務,並直接在我的模板中引用了該服務的一個屬性。 (例如{{$ scope.myService.someProperty}}) –

+0

@CraigSquire,我不確定將服務分配到$ scope是否好,因爲它將在AngularJS $ digest循環中完全檢查。我不需要那個。但值...這是好的,但該死的...爲什麼不是rootScope?所以我們應該爲每個服務創建app.value(例如類似的情況)? – dt0xff

+0

當然,也許只是看一個引用對象的服務的屬性。 $ scope.myData = $ scope.myService.myData並在模板中引用$ scope.myData.someProperty。不確定每個服務的app.value意味着什麼。在$ rootScope上存儲數據也是可以接受的,是的。我通常不會這樣做,因爲當你不知道還有什麼東西要放置時,它可能會成爲傾倒場。 –

回答

3

如果你只有數據,那麼你可以使用一個值。將值注入到每個控制器中並將其存儲在您的範圍中,然後在模板中引用該值的屬性。如果你使用服務,你可以做幾乎完全相同的事情。我的例子顯示了每個解決方案。

見下面的例子:如果你重新分配MyService.myData到一個新的對象 http://plnkr.co/edit/qTbSjnf6Q2FVDurGZhKd

<div ng-controller="MainCtrl"> 
    <input ng-model="mainVal.value"></input> 
    <input ng-model="mainSvcVal.value"></input> 
</div> 
<div ng-controller="OtherCtrl"> 
    <input ng-model="otherVal.value"></input> 
    <input ng-model="otherSvcVal.value"></input> 
</div> 

var app = angular.module('plunker', []); 

app.value('MyValue', {value: "Hello There"}); 

app.service('MyService', function() { 
    this.myData = { 
    value: "Goodbye" 
    } 
}); 

app.controller('MainCtrl', function($scope, MyValue, MyService) { 
    $scope.mainVal = MyValue; 
    $scope.mainSvcVal = MyService.myData; 
}); 

app.controller('OtherCtrl', function($scope, MyValue, MyService) { 
    $scope.otherVal = MyValue; 
    $scope.otherSvcVal = MyService.myData; 
}); 

有一點要注意的是,這將打破關係。

+0

它看起來不錯,但我不確定。所以,如果我們需要創建服務,我們應該創建app.value來存儲它的數據呢?爲什麼不只是服務?那麼服務的目的是什麼? – dt0xff

+0

「值」只是一種服務,您可以將原始的現有對象或函數分配給該對象,而不是像創建「服務」時那樣使用工廠或構造函數。 '服務'也可以存儲數據。 http://docs.angularjs.org/api/auto/object/$provide –

+0

我發現一個類似的問題以及其他方式。 http://stackoverflow.com/questions/12576798/angularjs-how-to-watch-service-variables –