Angular HTTP.get
関数は私のcontrollers.js
のサービスへservices.js
。
私が見つけた例はすべて、サービスを実装するための競合する方法があり、名前の選択は混乱しています。さらに、サービスの実際のangularドキュメントは、すべての例とは異なる構文を使用しています。これは非常に簡単ですが、ここで私を助けてください。
私が持っています app.js
、controllers.js
、services.js
、filters.js
。
app.js
angular.module('MyApp', []).
config(['$routeProvider', function($routeProvider)
{
$routeProvider.
when('/bookslist', {templateUrl: 'partials/bookslist.html', controller: BooksListCtrl}).
otherwise({redirectTo: '/bookslist'});
}
]);
controllers.js
function BooksListCtrl($scope,$http) {
$http.get('books.php?action=query').success(function(data) {
$scope.books = data;
});
$scope.orderProp = 'author';
}
モジュールと依存性注入の観点から考えてください。
だから、これらの3つのファイルがあるとしましょう
<script src="controllers.js"></script>
<script src="services.js"></script>
<script src="app.js"></script>
3つのモジュールが必要です
angular.module('MyApp', ['controllers', 'services'])
.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/bookslist', {
templateUrl: 'partials/bookslist.html',
controller: "BooksListCtrl"
})
.otherwise({redirectTo: '/bookslist'});
}]);
他の2つのモジュールはメインモジュールに挿入されるため、それらのコンポーネントはアプリ全体で使用できます。
現在、コントローラーはグローバル関数です。コントローラーモジュールに追加することができます。
angular.module('controllers',[])
.controller('BooksListCtrl', ['$scope', 'Books', function($scope, Books){
Books.get(function(data){
$scope.books = data;
});
$scope.orderProp = 'author';
}]);
Books
はコントローラー関数に渡され、mainアプリモジュールに挿入されたサービスモジュールによって利用可能になります。
ここでBooks
サービスを定義します。
angular.module('services', [])
.factory('Books', ['$http', function($http){
return{
get: function(callback){
$http.get('books.json').success(function(data) {
// prepare data here
callback(data);
});
}
};
}]);
サービスを登録する方法は複数あります。
factory
関数を使用し、オブジェクトを返すだけの私の好み。上記の例では、成功コールバックが渡されるget
関数を持つオブジェクトを返すだけです。エラー関数を渡すように変更することもできます。
Editコメントで@yairのリクエストに答えて、ここにディレクティブにサービスを注入する方法を示します。
通常のパターンに従い、最初にjsファイルを追加します
<script src="directives.js"></script>
次に、新しいモジュールを定義して、この場合はディレクティブを登録します
angular.module('directives',[])
.directive('dir', ['Books', function(Books){
return{
restrict: 'E',
template: "dir directive, service: {{name}}",
link:function(scope, element, attrs){
scope.name = Books.name;
}
};
}]);
app.js
のmainモジュールにdirectiveモジュールを挿入します。
angular.module('MyApp', ['controllers', 'services', 'directives'])
別の戦略に従って、モジュールをdirectivesモジュールに挿入することもできます
構文インライン依存アノテーションはほとんどすべてで同じであることに注意してください。ディレクティブは同じBooksサービスに注入されます。
更新されたPlunker: http://plnkr.co/edit/mveUM6YJNKIQTbIpJHco?p=preview
上記のファクトリサービスではなく、サービスserviceの実装を次に示します。それが役に立てば幸い。
app.js
angular.module('myApp', ['controllers', 'services'])
.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/bookslist', {
templateUrl: 'partials/bookslist.html',
controller: "BooksListCtrl"
})
.otherwise({redirectTo: '/bookslist'});
}]);
service.js
angular.module('services', [])
.service('books', ['$http', function($http){
this.getData = function(onSuccess,onError){
$http.get('books.json').then(
onSuccess,onError);
}
}]);
controller.js
angular.module('controllers',[])
.controller('BooksListCtrl', ['$scope', 'books', function($scope, books){
$scope.submit = function(){
$scope.books = books.getData($scope.onSuccess,$scope.onError);
}
$scope.onSuccess = function(data){
console.log(data);
$scope.bookName = data.data.bookname;
}
$scope.onError = function(error){
console.log(error);
}
}]);