私は使用するように変更したマスターの詳細を持つAngularJsアプリを持っています ui-router詳細を変更すると、AngularJs、マスター詳細更新マスター
以前、私は選択を通知するために、マスターが使用する たJavaScriptのオブザーバープレーンとSelectionService
を有しており、詳細によって自分自身を更新します。 の選択は技術的な識別子にすぎず、DetailsController
には があり、基本的にはローカルキャッシュであるBackendService
からアイテムを取得しています。
アイテムがマスターに選択されたときにui-routerを使用すると、詳細 の状態になり、同じフローが残ります(バックエンドから詳細を取得するために技術IDを使用します)。
私の問題は、以前のバージョンではすべての更新が詳細で行われたことです。 マスター上で自動的に更新されます。しかしそれはおそらくMasterController
とDetailsController
が が同じスコープを共有していないため、ui-router バージョンで壊れています。
私の質問は次のとおりです。 アイテムが変更されたときにアイテムのリストが更新されるようにするにはどうすればよいですか。あなたはAngularJsのいくつかの機能に頼っていますか(それでどうすればいいですか) 古典的なイベントメカニズムを$scope.$broadcast
と$scope.$on
で使用していますか?
編集は、より多くの調査
た後、私はAngularJsイベント($scope.$broadcast
、$scope.$emit
と$scope.$on
)の使用に対して明らかにされているいくつかの記事を読んで、カスタムイベントバス/アグリゲータをrecommandています。 しかし、私はそれを避け、AngularJsダイジェストのライフサイクルに頼っています。しかし、によって提案されているものは以下の通りです。@ Kashif ali私は持っているものですが、細部が変わると私のマスターは更新されません。
angular
.module('masterDetails')
.service('BackendService', function($q){
var cache = undefined;
var Service = {}
Service.GetImages = function() {
var deferred = $q.defer();
var promise = deferred.promise;
if (!cache) {
// HTTP GET from server .then(function(response){
cache = JSON.parse(response.data);
deferred.resolve(cache);
});
} else {
deferred.resolve(cache);
}
return promise;
}
Service.GetImage = function(key) {
return GetImages().then(function(images){
return images[key];
});
}
Service.SetImage = function(key, updated) {
GetImages().then(function(images){
images[key] = updated;
// TODO; HTTP PUT to server
});
}
})
.controller('MasterController', function(BackendService){
var vm = this;
vm.items = [];
vm.onSelect = onSelect;
init();
function init() {
BackendService.GetImages().then(function(images){
// images is a map of { key:String -> Image:Object }
vm.items = Object.keys(images).map(function(key){
return images[key];
});
});
}
function onSelect(image) {
$state.go('state.to.details', {key: image.key});
}
})
.controller('DetailsController', function(BackendService, $stateParams){
var vm = this;
vm.image = undefined;
init();
function init() {
BackendService.GetImage($stateParams.key).then(function(image){
vm.image = image;
}).then(function(){
// required to trigger update on the BackendService
$scope.$watch('[vm.image.title, vm.image.tags]', function(newVal, oldVal){
BackendService.SetImage(vm.image.key, vm.image);
}, true);
});
}
});
編集私は#/画像上のアプリimages
状態の開始を開いたときに、これは、だから、原因の状態に
です。次に、1つのイメージを選択してimages.edit
状態になり、すべて正常に動作し、詳細が変わるとマスターが更新されます。
#/ images /:キーがimages.edit
の状態の場合、マスターはマスターのすべての変更を無視します。
それは役立ちますが、私の問題を解決していない参考になるの希望。私の編集をお読みください。 –