2016-03-29 7 views
1

Kısa öykü, özellikle açısal bir uygulamaya açısal olarak yazılmayan bazı veri modeli kodlarını kullanmaya çalışıyorum. Bu kod, modüller için ES6 import/export sözdizimi kullanılarak yazılmıştır ve bunu kullanmaya devam etmek istiyorum. Yani böyle bir şey var:

import angular from 'angular'; 
export const services = {}; 
angular.injector(['ng', 'toastr']).invoke([ 
    '$q', 
    '$http', 
    '$rootScope', 
    (
    $q, 
    $http, 
    $rootScope 
) => { 
    services.$q = $q; 
    services.$http = $http; 
    services.$rootScope = $rootScope; 
    }, 
]); 

Sonra ben sadece içe aktarabilirsiniz: thusly ES6 modül sistemine uygun Açısal (1.5) hizmetlerini sunar bir yardımcı modül oluşturmak oldu Benim yaptığım

export class DataModel { 
    //some stuff with promises 
} 

DataModel sınıflarımdaki $ q kütüphanesi ve hey presto, her tür iş var - Söz veriyorum ve .then metotları ateşlendiğinde uygun kapsamlar güncellenmelidir. Sorun şu ki, bu aslında işe yaramıyor olmasıdır. Bunun işe yaramadığının% 90'ından eminim, angular.injector çağrısından aldığım $ rootScope öğesinin, bir tekton köklü değil, sadece bu bağlam için yaratılan yeni ve yeni bir tane olması. Herhangi bir kapsam bağlantısını sayfadaki gerçek kapsamla paylaşmaz (bunu bir DOM öğesi seçerek ve hizmetleri karşılaştırarak doğrulayabilirim. $ RootScope angular.element ($ 0) .scope(). $ Root). Bu nedenle, bir söz bir karar verdiğinde veya $ http iadesi verdiğinde, veriyi alırım ancak arayüzde bir kapsam özetini bildirmeyen standart belirtiler var (hiçbir şeyi elle sindirene kadar hiçbir şey değişmez).

Tek isteğim, etkin sayfada etkin olarak kullanılan $ q, $ rootScope ve $ http hizmetlerinin bir kopyası. Herhangi bir öneri kabul edilir. Bir sonraki denemem, enjektör ile yapmak yerine $ q et al harfini enjekte ettiğim bazı .run bloğundan ilgili hizmetleri alabiliyor muyum? Bu, bazı problemli zamanlama sorunlarını da beraberinde getiriyor, çünkü açılışı önyükleme, çalıştırma bloğunu çalıştırmam ve daha sonra hizmetleri veri modelime göstermem gerekiyor. Ancak önyükleme işlemi, veri modelini gerektirir. Biraz döngüsel.

+0

belki de bir uygulamayı önyükleme yapmalı ve sonra da onun kökünü taşımalısınız. –

+0

Zaten önceden yüklenmiş bir uygulama var, sorun oraya üretilen kök kablosunun, enjektörden el ile rootscope'u çağırdığınızda meydana gelen aynı kök kordonu olmamasıdır.Sürecin üzerine bir çeşit semafor koymam gerektiğini, uygulamanın önyükleme işlemi sırasında uygulamanın gerçek rootScope, q, http ve diğer hizmetlerini almam gerektiğini ve veri modelinin başlangıç ​​sürecini dondurmak/çözmek için semafor kullanmam gerektiğini düşünüyorum. – pfooti

cevap

0

Şimdilik bunu kendime yanıtlıyorum, ancak başka fikirleri görmeyi çok isterim.

import angular from 'angular'; 
import { Rx } from 'rx-lite'; 
export const servicesLoaded = new Rx.Subject(); 
export const services = {};  
angular.module('app.services', []).run([ 
    '$q', 
    '$http', 
    '$rootScope', 
    (
    $q, 
    $http, 
    $rootScope 
) => { 
    services.$q = $q; 
    services.$http = $http; 
    services.$rootScope = $rootScope; 
    servicesLoaded.onCompleted(); 
    }, 
]); 

Zaten rx-lite kullanıyordum beri zaten:

ben gibi görünmek angularServices kod değiştirdi. Bu Başvuru önyükleme döngüsünden sonra çalıştırılan kod çalışıyorum ne zaman bana

import { services } from 'angularServices'; 
services.$http(options) // etc; 

yapmanızı sağlar.

import { services, servicesLoaded } from '../../common/angularServices'; 
servicesLoaded.subscribeOnCompleted(() => { 
    services.$rootScope.$on('$stateChangeSuccess',() => { 
    //etc 

Ben $ rootScope temasa kalkmayın Bu şekilde: zamanından önce koşuyordu kodu için (ben thusly RxJS olayı içine sarılmış, birkaç yerde idi, yalnızca yapılandırma şeyler oldu veya gerçekte var olmadan önce $ pencere, $ q, $ rootScope ve $ http benim services nesnesinde bir başvuru saklıyorum aslında gerçek bir şey ve tüm doğru düzgün sindirmek.

Ve şimdi hey presto benim model katmanı $ http ve $ q referans alırken, diğer vaatler ve XHR'ler sağlayıcısıyla takas yapmak oldukça kolay olacak, ve ben de açısal 1.x.Tip'e bağlı olmayan tüm işleri yaptım.