Ember.js: рдзреНрдпрд╛рди рдореЗрдВ рди рдЖрдпрд╛ рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рд╕рдВрдкрддреНрддрд┐ 'hasRoute' рдкрдврд╝рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 11 рдЕрдЧре░ 2015  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: emberjs/ember.js

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдСрде рд╕реЗрд╡рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЬрдм рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реЗрд╡рд╛ рдореЗрдВ рдХреЛрдИ рдкрд┐рдЫрд▓рд╛ рд╕рдВрдХреНрд░рдордг рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рд░реНрдЧ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдРрдк рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рджреЗрддреЗ рд╣реИрдВ:

Uncaught TypeError: Cannot read property 'hasRoute' of undefined

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдбрд┐рдмрдЧ / рд╣рд▓ рдХрд░рдирд╛ рд╣реИред рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?

рдпрд╣рд╛рдБ рдореЗрд░реА рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╕реЗрд╡рд╛ рд╣реИ:

import Ember from 'ember';
import config from '../config/environment';

export default Ember.Service.extend({
    routing: Ember.inject.service('-routing'),
    loginCapable: true,
    localStorageKey: config.localStorageKeys.user,

    checkAuth(priorTransition){
        this.set('priorTransition', priorTransition);
        return this.get('isLoggedIn');
    },

    isLoggedIn: Ember.computed('user', function(){
        return !!this.get('user');
    }),

    init(){
        this.set('user', JSON.parse(window.localStorage.getItem( this.get("localStorageKey") )) );
    },

    login(adID){
        return Ember.$.ajax(
            config.apiHost + config.apiVersion + "/getLdapInfo",{
                type: 'GET',
                data: "adID="+adID
            }).then(json => {
                this.set('user', json);

                window.localStorage.setItem( this.get("localStorageKey") , JSON.stringify(json));

                var priorTransition = this.get('priorTransition');
                if( priorTransition )
                {
                    priorTransition.retry();
                    this.set('priorTransition', null);
                }else{
                    this.get('routing').transitionTo('index');

                }
            }, xhr => {
                return xhr.responseJSON ? xhr.responseJSON.message : "Login failed";
            });
    }
});

рдФрд░ рдореЗрд░рд╛ рд░рд╛рдЙрдЯрд░:

import Ember from 'ember';
import config from './config/environment';

var Router = Ember.Router.extend({
  location: config.locationType
});

Router.map(function() {
  this.route('authenticated', { path: '/' }, function(){
    this.route('index', { resetNamespace: true });
  });
  this.route('login');
});

export default Router;

рдпрд╣рд╛рдБ рдЙрд╕ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╣реИ:

import { moduleFor, test } from 'ember-qunit';
import Ember from 'ember';
import startApp from 'recruiter-admin/tests/helpers/start-app';
import Pretender from 'pretender';

var server,
    application;

var user = [{
            "adID":"uniqueID",
            "first_name":"First Name",
            "last_name":"Last Name",
            "employee_type":"Regular",
            "employee_id":"12345",
            "manager":"CN=managerID,OU=Employees,OU=company Users,DC=company,DC=com",
            "success":true
            }];

function jsonResponse(json, status = 200) {
    return [status, {"Content-Type": "application/json"}, JSON.stringify(json)];
}

moduleFor('service:auth', 'Unit | Service | auth', {
    unit:true,
    needs:['router:main'],
    beforeEach(){
        application = startApp();

        server = new Pretender(function(){
            this.get('/getLdapInfo', function(req){
                return jsonResponse(user.findBy('adID',req.queryParams.adID));
            });
        });
    },

    afterEach(){
        Ember.run(application, 'destroy');
        if( server ){
            server.shutdown();
        }
    }
});

// Replace this with your real tests.
test('it exists', function(assert) {
    var service = this.subject();
    assert.ok(service);
});

test('isLoggedIn Testing', function(assert){
    var service = this.subject();
    assert.ok(service.get('isLoggedIn') === false, 'Not logged in');

    Ember.run(()=>{
        service.set('user', true);
    });

    assert.ok(service.get('isLoggedIn') === true, 'IS logged in');
});

test('can login', function(assert){
    assert.expect(0);

    var service = this.subject();
    Ember.run(()=>{
        service.login('uniqueID');
    });

    andThen(()=>{
        assert.ok(service.get('user'));
    });

});

рдПрдореНрдмрд░ 2.0.0-рдмреАрдЯрд╛.5 . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЖрдк рдирд┐рдЬреА -routing рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ router рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд╕реЗрдЯрдЕрдк рд╣реЛред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдЗрд╕рдХрд╛ рдореЙрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рд░рд╛рдЙрдЯрд░ рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЗрд╕реЗ рдЕрдВрддрддрдГ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП) рдЭреВрдард╛ рдЕрдЧрд░ get(this, 'router') рдЭреВрдард╛ рд╣реИ) рдпрджрд┐ рдЖрдк рдПрдХ рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирд┐рдЬреА рдПрдкреАрдЖрдИ рдХрд╛ рдЧреИрд░-рд╕рдорд░реНрдерд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИред

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдк рдирд┐рдЬреА -routing рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ router рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд╕реЗрдЯрдЕрдк рд╣реЛред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдЗрд╕рдХрд╛ рдореЙрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рд░рд╛рдЙрдЯрд░ рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЗрд╕реЗ рдЕрдВрддрддрдГ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП) рдЭреВрдард╛ рдЕрдЧрд░ get(this, 'router') рдЭреВрдард╛ рд╣реИ) рдпрджрд┐ рдЖрдк рдПрдХ рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирд┐рдЬреА рдПрдкреАрдЖрдИ рдХрд╛ рдЧреИрд░-рд╕рдорд░реНрдерд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЦреБрд╢реА-рдЦреБрд╢реА рдПрдХ рдкреАрдЖрд░ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реВрдВрдЧрд╛ред

рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдпрд╛ред

рдмрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВред

const service = this.subject({
    routing: {
      transitionTo() {
        return true;
      }
    }
})

рдореИрдВ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдПрдореНрдмрд░ рдЯреАрдо рдкрд░ ember/service/routing.js рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИ

this.owner.unregister('service:router');
this.owner.register('service:router', mocks.routerService());

рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдХреЛ рдлреЗрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕реНрдЯрдм рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

nathanpalmer picture nathanpalmer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hilem picture hilem  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kellyselden picture kellyselden  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

adam-knights picture adam-knights  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

acorncom picture acorncom  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ