gpt4 book ai didi

javascript - ES2015 + ES2016(装饰器、推导式……)+ Angular 1.x 组件

转载 作者:行者123 更新时间:2023-11-29 21:45:27 25 4
gpt4 key购买 nike

我正在使用 Angular 1.x 开发 Web 应用程序架构,该架构仍用于将所有内容粘合在一起。定义一个新组件相当容易:

class CustomComponent {
constructor(dep1, dep2, dep3) {
this.deps = { dep1, dep2, dep3 };
/* app code */
}

/* link, compile, instance methods, template generators... */

@readonly static $inject = ['dep1', 'dep2', 'dep3'];
}

我想做的是排除注入(inject)问题 - 换句话说,我不想每次都编写 this.depsstatic $inject 代码时间,而是让它自动生成——比如说,使用类似 ES7 中的装饰器的东西。然后代码看起来像下面几行:

@injectionFromCtorComponents
class MyClass {
constructor (dep1, dep2, dep3) {
/* app logic */
}
}

现在,静态部分是可行的,尽管很丑陋:

const angularInjectAnnotationFromCtor = (target) => {
let regexStr = `^function ${target.name}\\\((.*)\\\)[.\\s\\S]*}$`;
let regex = new RegExp(regexStr, 'gm');
let ctorArgsStr = target.prototype.constructor.toString().replace(regex, '\$1');
let ctorArgs = ctorArgsStr.replace(/ /g, '').split(',');

target.$inject = ctorArgs;
};

不过,在实例上保存构造函数依赖性要复杂得多。我想到了以下内容,尽管它充其量是脆弱的:

const readonly = (target, key, descriptor) => Object.assign(descriptor, { writable: false });

class AngularComponent {
constructor () {
let ctorArgs = [...arguments];
let argNames = ctorArgs.pop();

// let's leave comprehensions out of this :)
this.deps =
argNames.reduce((result, arg, idx) => Object.assign(result, ({ [arg]: ctorArgs[idx] })), {});
}
}

@angularInjectAnnotationFromCtor
class MyClass extends AngularComponent {
constructor (one, two, three) {
super(one, two, three, MyClass.$inject);
}
}

是的,这比我们开始的地方更糟糕......

那么问题来了,有谁能对此提出更合理的解决方案吗?或者我们应该坐下来,希望在未来几年内随时在 Chrome 中使用代理?

最佳答案

你想法的静态部分基本上就像根本没有 $inject 一样。这是毫无意义的。

我建议忘记这个想法或将参数传递给装饰器:

@inject('dep1', 'dep2', 'dep3')
class MyClass {
constructor (dep1, dep2, dep3) {
/* app logic */
}
}

构造函数部分可以使用经典的装饰器模式来完成:

function inject() {
var dependencies = [...arguments];

return function decorator(target) {
target.$inject = dependencies;

return function() {
this.deps = {};
dependencies.forEach((dep, index) => {
this.deps[dep] = arguments[index];
});

target.constructor.apply(arguments, this);
return this;
}
}
}

关于javascript - ES2015 + ES2016(装饰器、推导式……)+ Angular 1.x 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com