"ウィジェット"に答えるネットワークサービスがあり、それぞれに別々にフェッチする必要があるより単純なオブジェクト「部品」が多数あります。私はこれをウィジェットとその一部の部品を取り出し、localStorageで結果をキャッシュする角度サービスとして公開したいと思いますが、私は問題に遭遇しています(コードに記されています、以下に記載します)...OOクラスのように動作する角度サービスを作成します
angular.module('myApp').service('myWidgetService', function ($q, requestService, localStorageService, _) {
// start everything off by fetching the Widgets, saving locally
this.refresh = function() {
var self = this;
return requestService.request('GET', '/api/widget/', true).then(function(result) {
self.setCloudArray(result);
// I want callers to use "Widget instances" defined below
return _.map(result, function(cloudItem) { return new Widget(cloudItem); });
});
};
// get and set persistent widget array
this.cloudArray = function() {
return localStorageService.get('cloudArray');
};
this.setCloudArray = function(cloudArray) {
localStorageService.set('cloudArray', cloudArray);
};
// I want this "Widget instance" to provide methods related to a single widget
var Widget = function(cloudItem) {
this.cloudItem = cloudItem; // PROBLEM A: (this indirection hurts me later)
};
// get the parts, but only if they haven't been fetched already
// if they've been fetched, return the cached copy
Widget.prototype.parts = function() {
var self = this.cloudItem; // weirdness due to PROBLEM A
if (self.parts) { return $q.when(self.parts); }
var route = '/api/widget/' + self._id + '/parts';
return requestService.request('GET', route, true).then(function(result) {
self.parts = result; // PROBLEM B: how to persist?
return result;
});
};
Widget.prototype.partWithId = function(id) {
return _.find(this.cloudItem.parts, function(part) { return part._id === id; });
};
});
私が持っている2つの問題は、コードにフラグが立てられています。
問題A:私は本当に私のウィジェットにcloudItemプロパティを追加したくありません。ウィジェットメソッドでは、オブジェクトのfoo
プロパティのためにthis.foo
のようなものを言いたいと思いますが、私はthis.cloudItem.foo
と言っています。
問題B:大きな問題は、ウィジェットの部品の呼び出しが高価で、結果をキャッシュしたいということです。しかし、ローカルストレージが知っていることは、私のインスタンス "cloudItem"がメンバーであるオブジェクトの配列です。私は私のウィジェットオブジェクトからその保存を行うエレガントな方法を知らない。私は部品を取り出した後、呼び出し
this.saveWidget = function(updatedWidget) {
var cloudArray = this.cloudArray();
var currentItem = _.find(cloudArray, function(i) { return i._id === updatedWidget._id; });
var index = cloudArray.indexOf(currentItem);
cloudArray[index] = updatedWidget;
this.setCloudArray(cloudArray);
};
:
私はこのようなクラスレベルで洗練メソッドは、ローカルストレージを更新するために書かれました。これはうまくいきますが、私はJSやWeb開発にあまり経験はありませんが、私は自分自身を穴に掘り下げていることを知っています。私はサービスとJSオブジェクトについてたくさんのことを読んだことがありますが、私は何か重要なものを見逃しています。
私のWidgetオブジェクトで余分な間接を避け、ローカルストレージに自分自身を保存するために、より直接的、より多くの方法を与えるにはどうすればよいですか?
ご協力いただきありがとうございます。
なぜウィジェットを配列ではなくオブジェクトとして保存しないのか不思議です。配列をループするよりオブジェクトのプロパティを取得するほうがずっと簡単で安価です – charlietfl
@charlietfl - ウィジェットの配列をインスタンス化して保存するのですか?これは私の愚かさの証拠ですが、私はローカルストレージ内のオブジェクトの "プロトタイプ"のもの(関数)を保存することがわからないため、抵抗しました。私を混乱させるJSの別の部分だと思います。 – user1272965
ああ、多分@charlietfl、あなたはローカルストレージ内のIDで状態(cloudItem)を保存すべきだと言っていますか?それはいい考えです。たぶんコンストラクタでそれを行うと、インスタンスレベルで保存メソッドを書くことができます。それは既に大きな助けとなっています。 – user1272965