ES2015 单例或服务提供商或模块,用于敲除.js组件
ES2015 Singleton or Service Provider or Module for Knockout.js components
我有大量的淘汰组件,目前正在使用KO.postbox进行通信。
我现在想创建一个中央服务提供商/存储库/单例,它集中存储所有这些组件的数据并提供初始化、API 和其他功能。
该页面只有一个窗口/会话,但每个窗口/会话都有 3-7 个 Knockout 组件,在某些情况下,同一组件会在页面上多次加载。 结果是通过 API 加载数据的组件和也需要相同数据的组件之间的大量颤动。
我目前的方法是使用单例模式(其他方法很乐意考虑(。 唯一不可更改的要求是:
- 从一个中央"存储库"中存储和检索多个KO组件的数据
- 写在ES2015中,能够与Babel一起工作
- 可作为模块加载和导出
当前代码的问题是
一个。这被设置为未定义 babel,例如 this.instance = null
引发无法设置未定义的实例的错误。b.我不确定这是最好的方法,或者我是否可以使其工作
代码如下
const ko = require('knockout')
, moment = require('moment')
, postbox = require('knockout-postbox')
, aja = require('aja');
const myServiceSingleton = () =>{
this.instance = null;
this.array1 = ko.observable([]);
this.array2 = ko.observable([]);
// revealing module pattern that handles initialization of our new singleton service provider
const initializeNewModule = () => {
const setArray1 = (array) => {
console.info( 'Set Array1 Called' );
this.array1(array);
};
const getArray1 = () => {
console.info( 'Get Array1 Called' );
return this.array1();
};
const setArray2 = (array) => {
console.info( 'Set Array2 Called' );
this.array2(array);
};
const getArray2 = () => {
console.info( 'Get Array2 Called' );
return this.array2();
};
const myAwesomeFunction = () => {
// Perform some amazing computations on Array1 and Array 2
};
return {
setArray1 : setArray1,
getArray1 : getArray1,
setArray2 : setArray2,
getArray2 : getArray2,
myAwesomeFunction : myAwesomeFunction
};
};
// handles the prevention of additional instantiations
const getInstance = () => {
if( ! this.instance ) {
this.instance = new initializeNewModule();
}
return this.instance;
};
return {
getInstance : getInstance
};
};
module.exports = myServiceSingleton;
---------编辑----------
希望这对其他人有所帮助...
const ko = require('knockout')
, moment = require('moment')
, postbox = require('knockout-postbox')
, aja = require('aja');
const array1 = ko.observable([]);
const array2 = ko.observable([]);
const secretFlag = ko.observable(false);
const myAmazingSingleton = {
setArray1(newArray) {
console.info( newArray);
array1(newArray);
},
getArray1() {
console.info( 'Get Array1 Called' );
return array1();
},
getArray2() {
return array2();
},
setArray2(newArray) {
console.info('Set Array2 Called');
array2(newArray);
},
getArray1Observable() {
return array1 ;
},
myAwesomeFunction() {
// Perform some amazing computations on Array1 and Array 2
array1.map //etc etc
}
};
export default myAmazingSingleton ;
使用非常简单:
import ArrayFunctions from 'myAmazingSingleton';
let array1 = ArrayFunctions.getArray1();
数据可在多个挖空组件中使用
不能将箭头函数用作构造函数。你真的应该只使用一个简单的对象文字:
const myServiceSingleton = {
array1: ko.observable([]),
array2: ko.observable([]),
setArray1(array) {
console.info( 'Set Array1 Called' );
this.array1(array);
},
getArray1() {
console.info( 'Get Array1 Called' );
return this.array1();
},
setArray2(array) {
console.info( 'Set Array2 Called' );
this.array2(array);
},
getArray2() {
console.info( 'Get Array2 Called' );
return this.array2();
},
myAwesomeFunction() {
// Perform some amazing computations on Array1 and Array 2
}
};
如果你坚持,你可以做一个
export function getInstance() {
return myServiceSingleton;
}
甚至懒惰地初始化它,但通常你应该export default
它。
我认为您要使用的单例是主视图模型,我的意思是设置Knockout的常用方法。使用组件的params
从主视图模型传递组件需要共享的任何可观察量。
相关文章:
- 起始节点.js用于并行的线程池
- 如何在设置后将 Express.js 用于新的 Web 应用
- 设置money.js(用于货币转换器)时出现问题
- JS用于鼠标悬停图像上传按钮(如Facebook)
- 简单JS用于循环混淆
- 将Ember.js用于单页网站(不是真正的网络应用程序)
- 如何在清单版本 2 中将模板与主干.js用于 Chrome 扩展程序
- Google Analistics.js用于单页网站
- Ramda js:用于具有嵌套对象数组的深度嵌套对象的镜头
- Jasmine + Node.js用于服务器端单元测试.如何运行测试
- 轨道 4 - JS 用于具有简单形式的依赖字段
- Angular js 用于在 Putty 中执行命令
- 整页.js - 用于控制幻灯片并保持固定在同一位置的导航元素
- 将节点 JS 用于前端
- 使用制图.js用于可视化全球地图中的信息
- JS用于带有JSON数据的Flot中的循环
- 动态打包css&js用于模板
- Backbone.js用于多个类似对象属性的通用模板
- 节点JS用于NOT异步
- Knockout js:用于绑定对象而不是单个值的代码