2016-09-22 40 views
1

http://jsfiddle.net/9hazjjcc/裝訂服務變量要控制AngularJS

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

function MyCtrl($scope, myService) { 
    $scope.targetMode = myService.targetMode; 
    $scope.myService = myService; 
} 

myApp.service('myService', function() { 
    this.targetMode = 2; 
}); 

function ctrlTwo($scope, myService) { 
    $scope.addToTargetMode = function() { 
    myService.targetMode++; 
} 
} 

HTML:

<div ng-controller="MyCtrl"> 
    <p>Hello, {{ targetMode }}!</p> 
    <p>Hello, {{ myService.targetMode }}!</p> 
</div> 

<div ng-controller="ctrlTwo"> 
    <button ng-click="addToTargetMode()"> 
    Add To Target Mode 
    </button> 
</div> 

此的jsfiddle說大部分。我想在控制器中使用一個服務變量來操縱視圖,但是我不想將整個服務公開給控制器,因爲這看起來不是很像Angular-like。還是被認爲是最佳做法?

在理想情況下,第一個段落將更新從每當它改變了服務顯示targetMode變量。

回答

0

你的方式,它不壞,如果你的服務是爲了管理「目標模式」,就可以使用這種方式,但我認爲不是暴露this.targetMode = 2,這是服務功能,您可以使用像模特模式的服務,在你的服務,你可以做些事情是這樣的:

myApp.service('myService', function() { 
    var targetMode = 2; 

    return { 
     getTargetMode: function() { return targetMode; } 
}); 

您可以在您服務的私人功能混合,只有公開曝光,等等等等

但是,在我看來,由於到targetMode的背景下,我認爲這是最好是控制器變量(scope變量我的意思),你也知道,服務不被注入一個範圍,他們並不像一個PA範圍週期的室溫,而你在模板中使用這個變量,所以我想你想的角「綁定」,所以最好使用範圍變量,並宣佈在控制器(也許在一個自定義的指令取決於每個案件)。這是角度方式。 如果使用服務(非範圍VAR),則可以在控制器手動觀看或作爲你正在做的,則可以使用一個功能作爲一個觀察者,但使用範圍變量是更有效的。

事情是,你用於綁定的$ scope變量:$ scope.addToTargetMode,被聲明爲一個函數,對,它是正確的,因爲你需要去服務,在digest循環中這是少的有效地直接使用控制器中的值。讓我解釋一下,在所有的摘要循環中,角將執行你的函數。所以,如果你直接使用範圍變量(忘記服務),摘要週期不會是一個輔助調用,因爲範圍有「他自己的優秀管理」。 角手錶本身的範圍變量:對象,字符串,數字,數組,如果它的變化,你有沒有做任何事情!但作用域函數變量的角度神品最差的,因爲在所有會做「轉變」摘要循環這個函數將被計算。

所以,總是在你將使用一個變量綁定,認爲控制器,例如服務,如果你需要從BBDD或任何得到的數據將是不錯的。可以肯定,如果你使用的角度1.X.X這隻適用,角2是其他歷史