Глобални променливи в Ember

Какъв би бил подходящият метод за съхраняване на глобална променлива в Ember? Например, имам потребителски модел в Ember, но винаги бих искал да знам кой конкретен екземпляр от този модел (включително неговия идентификатор, име, имейл и т.н.) съответства на влезлия в момента потребител.

Трябва ли по някакъв начин да съхранявам това в Ember? Или е по-добре просто да прикачите JS променлива към window обекта (напр. window.currentUserId = 1;) и да го използвате?


person NudeCanalTroll    schedule 12.02.2013    source източник
comment
Използвайте поне User обект, както в window.user = ....   -  person Reactormonk    schedule 13.02.2013
comment
Можете да съхраните това състояние във вашето приложение. Приложение = Ember.Application.create({ currentUser: null}). Задайте потребителя с App.set(user, user), когато сте готови.   -  person mavilein    schedule 13.02.2013
comment
Съхранявам някакво централно състояние в приложението си и то работи добре. Малко мирише, но ми се струва осъществимо, ако не се прекалява с този подход.   -  person mavilein    schedule 13.02.2013
comment
Бих избрал подхода App.CONFIG (с главни букви, което означава, че е константа). По този начин ние винаги затрупваме глобалното пространство на имена само с едно var (App).   -  person Wildhoney    schedule 13.02.2013
comment
този отговор на подобен въпрос изглежда много чист: stackoverflow.com/a/16879306/2413043   -  person amenthes    schedule 07.08.2014


Отговори (1)


Отказ от отговорност: Всички техники, показани по-долу, са моят опит с EmberJS през последните няколко месеца, плюс някои дискусии с моите колеги. Ако има нещо неправилно, моля, повишете тон. Всички сме във фаза на учене (и ember.js doc е гаден за maxxx, така че бъдете любезни ;)

В момента на работното ми място има двама разработчици, които използват Ember.js. Стигнахме до извода, че съхраняването на глобални променливи в глобалния ApplicationController е много по-добро от съхраняването в пространството на имената на приложението. Това е така, защото извличането на тази стойност може да бъде много объркващо, ако се съхранява в пространството на имената на приложението. И това работи добре и при затваряне и следователно прави глобалното пространство на имената чисто (и относително без хакване). Не искате вашият потребител да прави App.set, за да се забърква с променливата, нали?

Това се основава на 1.0.0 преди 4.

Имайки предвид, че имате тази currentUserId глобална променлива

  1. Съхраняване в пространството на имената. демонстрация на jsFiddle

    (function() {
    
        function r() {
            return Math.round(Math.random()*999);
        }
    
        var MyApp = Ember.Application.create({
            currentUserId: null,
            ready: function() {
                //demo purpose.
                this.set('currentUserId', r());
            },
            rootElement: '#demo'
        });
        MyApp.ApplicationView = Ember.View.extend({
            templateName: 'application-view',
    
            //Direct child view
            innerView: Ember.View.extend({
                templateName: 'inner-view',
                setValue: function() {
                    this.set('controller.namespace.currentUserId', r());
                }
            }),
    
            //Direct child view, but with a controller attached
            innerViewWithController: Ember.View.extend({
                controller: Ember.Controller.create(),
                templateName: 'inner-view-with-controller',
                setValue: function() {
                    this.set('parentView.controller.namespace.currentUserId', r());
                }
            }),
            getValue: function() {
                alert(this.get('controller.namespace.currentUserId'));
            },
            setValue: function() {
                this.set('controller.namespace.currentUserId', r());
            }
        });
    })();
    
  2. срещу съхраняване в глобален ApplicationController демонстрация на jsFiddle

    (function() {
    
        function r() {
            return Math.round(Math.random()*999);
        }
    
        var MyApp = Ember.Application.create({
            ApplicationController: Ember.Controller.extend({
                currentUserId: null,
                init: function() {
                    //demo purpose
                    this.set('currentUserId', r());
                }
            }),
            rootElement: '#demo'
        });
        MyApp.ApplicationView = Ember.View.extend({
            templateName: 'application-view',
    
            //Direct child view
            innerView: Ember.View.extend({
                templateName: 'inner-view',
                setValue: function() {
                    this.set('controller.currentUserId', r());
                }
            }),
    
            //Direct child view, but with a controller attached
            innerViewWithController: Ember.View.extend({
                controller: Ember.Controller.create(),
                templateName: 'inner-view-with-controller',
                setValue: function() {
                    this.set('parentView.controller.currentUserId', r());
                }
            }),
            getValue: function() {
                alert(this.get('controller.currentUserId'));
            },
            setValue: function() {
                this.set('controller.currentUserId', r());
            }
        });
    })();
    

Забележи, че:

  1. Ако изберете да съхранявате в пространството на имената, ще трябва да имате достъп до него през основния контролер през цялото време, така че всъщност е същото като съхраняването в ApplicationController с допълнителна ключова дума namespace.

  2. Ако сте избрали да го съхраните в корен applicationController, независимо от изгледите, които се спускат от applicationView, можете лесно да получите достъп до променливата във вашите шаблони с {{variableName}} без обхождане на точки. По подразбиране Ember.Js търси променливи чрез контролери.

  3. В най-лошия случай, ако вашият вътрешен изглед трябва да има собствен контролер, достъпът до глобалната променлива чрез основния контролер (или пространството на имената) е малко по-болезнен, тъй като контролерите не са свързани, ще трябва да обхождате вашите изгледи, докато видите корена контролер. В Ember.JS всички изгледи по подразбиране ще имат зададен контролер и по подразбиране контролер на родителя. Което означава, че ако никога не посочите никакъв контролер, всички наследствени изгледи всъщност са свързани с основния контролер. За да преодолеете този проблем, можете да направите свързване на променливи в контролера, за да разрешите лесно грозотата при преминаване.

Не ви предлагам да поставите толкова важна променлива в глобалния обект window, тъй като тя лесно ще бъде модифицирана от потребителя (и повдига всякакви потенциални проблеми). Поставянето му в глобалното пространство от имена в пространството от имена на приложението ember намалява потенциалния проблем, но не и ако го направите глобално

Моите 2 цента ;)

person Lionel Chan    schedule 13.02.2013