在 Ember 中存储全局变量的合适方法是什么?例如,我在 Ember 中有一个用户模型,但我总是想知道该模型的哪个特定实例(包括它的 id、名称、电子邮件等)对应于当前登录的用户。
我应该以某种方式将其存储在 Ember 中吗?还是将 JS 变量附加到window
对象(例如window.currentUserId = 1;
)并使用它更好?
在 Ember 中存储全局变量的合适方法是什么?例如,我在 Ember 中有一个用户模型,但我总是想知道该模型的哪个特定实例(包括它的 id、名称、电子邮件等)对应于当前登录的用户。
我应该以某种方式将其存储在 Ember 中吗?还是将 JS 变量附加到window
对象(例如window.currentUserId = 1;
)并使用它更好?
免责声明:下面显示的所有技术都是我过去几个月使用 EmberJS 的经验,以及与同事的一些讨论。如有不妥,请提高声音。我们都处于学习阶段(并且 ember.js 文档很烂,所以请善待;)
目前我的工作场所有两个开发人员正在使用 Ember.js。我们得出一个结论,将全局变量存储在 globalApplicationController
中比存储在应用程序命名空间中要好得多。这是因为如果该值存储在应用程序命名空间中,检索该值可能会非常混乱。这在闭包中也很有效,因此使全局命名空间干净(并且相对无破解)。您不希望您的用户App.set
弄乱变量对吗?
这是基于 1.0.0 pre-4。
考虑到你有这个currentUserId
全局变量
存储在命名空间中。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());
}
});
})();
vs 存储在全局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());
}
});
})();
注意:
如果您选择存储在命名空间中,您将需要一直通过根控制器访问它,因此它实际上与使用额外namespace
关键字存储在 applicationController 中相同。
如果您选择将其存储在 rootapplicationController
中,那么对于从 中继承的任何视图applicationView
,您都可以轻松访问模板中的变量,{{variableName}}
而无需任何点遍历。默认情况下,Ember.Js 通过控制器查找变量。
在最坏的情况下,如果您的内部视图需要有自己的控制器,通过根控制器(或命名空间)访问全局变量会稍微痛苦一些,因为控制器没有链接,您需要遍历视图直到看到根控制器。在 Ember.JS 中,默认情况下,所有视图都会有一个控制器集,并且默认情况下是父级的控制器。这意味着如果您从不指定任何控制器,所有后代视图实际上都链接到根控制器。为了克服这个问题,可以在控制器中做变量绑定,轻松解决遍历的丑陋。
我不建议您将如此重要的变量放在全局window
对象中,因为它很容易被用户修改(并引发任何潜在问题)。将其放在 ember 应用程序命名空间中的全局命名空间中可以减少潜在问题,但如果将其设为全局则不会
我的 2 美分 ;)