javascript - Angular-js ile typescript - veriler controller'larda mı yoksa servislerde mi tutulmalı?


Bir web API sunucusu geliştiriyorum ve yakın zamanda istemci tarafını da geliştirmeye başladım, bu taraf Angular-js ve TypeScript ile geliştiriliyor.

Müşteri tarafı kodumun tasarımıyla ilgili emin olmadığım bir şey var.

Örneğin, bir öğeler listesini gösteren bir görünümüm olduğunu ve bu görünümün denetleyicisinin her seferinde bir düğmeye tıklandığında (örneğin) birçok kez oluşturulduğunu varsayalım. Bu görünüm bir öğeler listesi sunar ve bu nedenle bu dizi her oluşturulduğunda denetleyici aracılığıyla Http GET üzerinden alınır ve görünümde

 ng-repeat="item in vm.items"

Ancak bana öyle geliyor ki, bu listeyi, anlayışıma göre her istemci için yalnızca bir kez oluşturulan bir serviste kaydedebilirsem, servis oluşturulduğunda tek bir GET isteği kullanabilir ve görünümde bunu şöyle kullanabilirim:

ng-repeat="item in vm.service.items"

Ve bu öğe listesindeki güncellemeler yalnızca SignalR kullanımıyla gerçekleşecektir.

İkinci yaklaşımın kusurları var mı? Çünkü şu anda bunu yapmamamak için bir sebep göremiyorum.

Cevap #1

Evet, bu bana klasik bir DAL servisi gibi geliyor. Orada bir promise ile çalışmanızı tavsiye ederim, böylece istenen verinin ne zaman çözüleceğini takip edebilirsiniz. İşte bir örnek:

 export class EntityProvider {
        static serviceName: string = "entityProvider";

        private entity = null;

        static $inject : string[] = ["YourService", "$q"];
        constructor(yourService: YourService, private mQService: ng.IQService) {

        }

        get getEntity(): ng.IPromise<ConnectionInfoDto[]> {
            if (this.entity === null) {
                return this.yourService.getEntity()
                    .then(result => {
                        this.entity = result.data;
                        return this.entity;
                    });    
            } else {
                return this.mQService.when(this.entity);
            }
        }


        static bootstrap(aModule: ng.IModule) {
            return aModule.service(this.serviceName, EntityProvider);
        }
    }