Angular JS でビューを伴う Service ってどう書けばいいんですか
続きをかきました。
よくわからなかったので以下のようにしましたが、まっとうな方法には思えないので正しいやりかたをおしえていただきたく申し上げます……
- factory で空のオブジェクトをかえしとく
- view に紐付けた controller で factory で作ったオブジェクトを初期化する
- 作った Service を依存に加えて使う
一応、controller 間は直接依存しない (Service を mock にさしかえれば動く) のでユニットテストは書けると思うけど、よくわかりません……
myApp.factory('DialogService', function () { return { } });
myApp.controller('DialogControl', function ($scope, $q, DigalogService) {
DialogService.open = function (title, message) {
$scope.deferred = $q.defer();
$scope.show = true;
return $scope.deferred.promise;
};
$scope.close = function () {
$scope.show = false;
$scope.deferred = null;
};
$scope.ok = function () {
$scope.deferred.resolve(true);
};
});
// User
myApp.controller('FooController', function ($scope, DialogService) {
DialogService.open('foo', 'bar').then(function () {
...
});
}); そもそも "View independent business logic: Services" と書いてあるので、定義からして Service はビューを持ってはいけないようです。
じゃあビューを伴う Service 的なものはどうやって書くんですか
関連エントリー
- AngularJS で http リクエスト中画面内のボタンを disabled にする とにかく面倒だから全部の http リクエストを監視してボタンをオフにしたい。という要件 いまいちいい方法が思いうかばないけど以下のようにし...
- AngularJS 依存を持つ filter のテスト myApp = angular.module('myApp', [ 'myApp.filters', 'myApp.services' ])...
- JSDeferred -> Promise 置き換え方法 もはや Promise がスタンダードに入り、モダンな実行環境ではポリフィルすら必要なく使えるケースが増えましたね。 かくいう自分も JSD...
- AngularJS のテストでページ側のスクリプトを実行する protractor (webdriver) を使った場合、外から executeAsyncScript を使うと文字列でページ側で実行でき...