// класс, описывающий состояние
class WishlistState {
items: Item[];
ids: {[id:string]:boolean};
}
// reducer
export function wishlist(state:WishlistState = null, action){
switch(action.type){
case ADD_PRODUCT:
return {
items: [...(state&&state.items || []), action.payload],
ids: {...state.ids, ...{action.payload.id:!0}}
};
case FETCH_WISHLIST:
return {
items: action.payload,
ids: actions.payload.reduce((acc,v)=>{acc[v.id]=!0; return acc;}, {})
};
default: return state;
}
}
// сервис, через который производится вывод данных в компоненте и проверка на содержание элемента в корзине по id'шнику
class WishlistService {
state: Observable<WishlistState>;
items: Observable<Item[]>;
constructor(store, api){
this.state = store.select(s=>s.wishlist).filter(i=>!!i);
this.items = this.state.map(i=>i.items);
}
fetch(){
this.api.getWishlist().subscribe(data=>{
this.store.dispatch({
type: FETCH_WISHLIST,
payload: data
})
})
}
contains(id):Observable<boolean>{
return this.state.map(i=>!!i.ids[id]);
}
add(item:Item){
this.store.dispatch({
type: ADD_PRODUCT,
payload: item
})
}
}
HttpClient
из @angular/common/http
// service
getUsers(){
return this.http.get('url').map(resp=>resp.json()||[]);
}
// component
// 1 вариант
users: [];
// 2 вариант
users: Observable<[]>;
ctor(uSvc:UserService){
// 1 вариант
uSvc.getUsers().subscribe(users=>this.users=users);
// 2 вариант
this.users = uSvc.getUsers();
}
function handleModuleRef(moduleRef: NgModuleRef<{}>, callback: Function, req, res) {
const state = moduleRef.injector.get(PlatformState);
const appRef = moduleRef.injector.get(ApplicationRef);
const router = appRef.components[0].instance.router;
const zone = appRef.components[0].instance.zone;
zone.run(() => {
router.navigateByUrl(req.originalUrl);
});
appRef.isStable
.filter((isStable: boolean) => isStable)
.first()
.subscribe((stable) => {
const bootstrap = moduleRef.instance['ngOnBootstrap'];
bootstrap && bootstrap();
if (!res || !res.finished) callback(null, state.renderToString());
});
}
return this.http.get('./user.json').first()
this.subscriptions.push(this....subscribe())
ngOnDestroy(){
this.subscriptions.forEach(i=>i.unsubscribe())
}
var clientUrls = _(clients).filter(function(i){
return i.full_name.indexOf('Петров')>=0;
})
.map(function(i){
return i.url;
}).value();
var myTickets = _.filter(tickets, function(t){
return _.some(clientUrls, function(i){return i===t.client_url;});
});
function run($rootScope, auth) {
// ...
var noAuth = ['page.login','page.404'];
$rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
var isAuth = auth.isAuth();
if (toState.name === 'page.login' && isAuth) {
event.preventDefault();
$rootScope.$state.go('app.home');
}
else if (!(toState.name in noAuth) && !isAuth) {
event.preventDefault();
$rootScope.$state.go('page.login');
}
});
};
function sessionservice($localStorage) {
var service = {
setAccessToken: setAccessToken,
clearAccessToken: clearAccessToken,
getAccessToken: getAccessToken,
getTokenInfo: getAccessTokenOpenInfo
};
return service;
function setAccessToken(tokenData) {
$localStorage.auth = tokenData;
if ($localStorage.auth.expires_in)
$localStorage.auth.expires_in = $localStorage.auth.expires_in * 10e3 + Date.now();
}
function clearAccessToken() {
delete $localStorage.auth;
}
function getAccessToken() {
if (!$localStorage.auth || !$localStorage.auth.expires_in || $localStorage.auth.expires_in < Date.now()) {
clearAccessToken();
return undefined;
}
else
return $localStorage.auth.access_token;
}
function getAccessTokenOpenInfo() {
var token = getAccessToken();
return !token ? undefined : JSON.parse(atob(token.split('.')[1]));
}
}
function authinterceptor($q, $rootScope, session) {
var request = function (config) {
config.headers = config.headers || {};
var token = session.getAccessToken();
if (token) {
config.headers.Authorization = 'Bearer ' + token;
}
return config || $q.when(config);
};
var responseError = function (rejection) {
if (rejection.status === 401) {
session.clearAccessToken();
$rootScope.$state.go('page.login');
}
return $q.reject(rejection);
};
return {
request: request,
responseError: responseError
};
}