我正在编写一个流星/陨石包,并且它正在运行,但许多值都是硬编码的,应该是可配置的。
我希望用户能够通过添加
来设置包内的值Package.config({
setting1: value1,
setting2: value2,
...
})
应用代码中的某个地方。然后,我会使用PackageConfig.setting1
,PackageConfig.setting2
等内容读取包中的值。
这是一个好的,简单的方法吗?我看过的示例包看起来有点复杂,我想知道这是否必要。
答案 0 :(得分:1)
这是我的一个简单的谷歌地图包,它提供了你要求的类似设计模式:
client / lib / google-maps.js:
GoogleMaps={
// public methods
config:function(options){
_.extend(this,options);
},
ready:function(){
this._loadingDependency.depend();
return this._ready;
},
// private methods
_loaded:function(){
this._ready=true;
this._loadingDependency.changed();
},
// public members
apiKey:"",
// private members
_ready:false,
_loadingDependency:new Deps.Dependency()
};
_googleMapsLoaded=function(){
GoogleMaps._loaded();
};
Meteor.startup(function(){
if(!GoogleMaps.apiKey){
throw new Meteor.Error(-1,"API key not set, use GoogleMaps.config({apiKey:YOUR_API_KEY});");
}
$.getScript("https://maps.googleapis.com/maps/api/js?key="+GoogleMaps.apiKey+"&callback=_googleMapsLoaded");
});
package.js(警告,Meteor< 0.9软件包API,预计在不久的将来会发生重大变化)
Package.describe({
summary:"Google Maps packaged for Meteor."
});
Package.on_use(function(api){
api.use(["jquery","deps"],"client");
//
api.add_files([
"client/lib/google-maps.js"
],"client");
//
api.export(["GoogleMaps","_googleMapsLoaded"],"client");
});
所以基本上它是一个简单的包,允许用户通过此调用指定自己的谷歌API密钥客户端:GoogleMaps.config(...);
当地图API完全加载时,我们会通过反应就绪方法获得通知。
我使用传统的OOP编程风格来区分包暴露的内容和实现的私有内容。 该软件包仅导出顶级公共对象(GoogleMaps),可通过公共接口进行配置。 然后,您可以按照您的要求在包实现中引用GoogleMaps.apiKey。