我应该以某种方式将它存储在Ember中吗?或者只是将JS变量附加到窗口对象(例如window.currentUserId = 1;)并使用它?
解决方法
目前我的工作场所有两个开发人员正在使用Ember.js.我们得出结论,在全局ApplicationController中存储全局变量比在应用程序命名空间中存储要好得多.这是因为如果将该值存储在应用程序命名空间中,则该值的检索可能会非常混乱.这也适用于闭包,因此使全局命名空间清晰(并且相对无攻击).您不希望您的用户使用App.set来混淆变量吗?
这是基于1.0.0之前的4.
考虑到你有这个currentUserId全局变量
>存储在命名空间中. jsFiddle demo
(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',getValue: function() { alert(this.get('controller.namespace.currentUserId')); },setValue: function() { this.set('controller.namespace.currentUserId',r()); } }); })();
> vs存储在全局ApplicationController jsFiddle demo中
(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',setValue: function() { this.set('controller.currentUserId',setValue: function() { this.set('parentView.controller.currentUserId',getValue: function() { alert(this.get('controller.currentUserId')); },setValue: function() { this.set('controller.currentUserId',r()); } }); })();
注意:
>如果选择存储在命名空间中,则需要始终通过根控制器访问它,因此它实际上与使用额外的命名空间关键字存储在applicationController中相同.
>如果您选择将其存储在根applicationController中,对于从applicationView下降的任何视图,您可以使用{{variableName}}轻松访问模板中的变量,而无需任何点遍历.默认情况下,Ember.Js通过控制器查找变量.
>在最坏的情况下,如果您的内部视图需要拥有自己的控制器,那么通过根控制器(或命名空间)访问全局变量会更加痛苦,因为控制器没有链接,您需要遍历视图,直到看到根控制器.在Ember.JS中,默认情况下,所有视图都将具有控制器集,默认情况下为父控制器.这意味着如果您从未指定任何控制器,则所有后代视图实际上都链接到根控制器.要解决这个问题,您可以在控制器中进行变量绑定,以轻松解决遍历丑陋问题.
我不建议你把这么重要的变量放在全局窗口对象中,因为它很容易被用户修改(并引发任何潜在的问题).将它放在ember应用程序命名空间中的全局命名空间中可以减少潜在的问题,但如果将其设置为全局则不会
我2美分;)