关于angular–如何为所有延迟加载的模块提供自定义提供程序和angular按需加载的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android–IQ自定义提供程序无法识别、Angul
关于angular – 如何为所有延迟加载的模块提供自定义提供程序和angular按需加载的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – IQ自定义提供程序无法识别、Angular 10:为延迟加载的模块创建捆绑包、Angular 2如何为延迟加载的模块提供单例服务、Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- angular – 如何为所有延迟加载的模块提供自定义提供程序(angular按需加载)
- android – IQ自定义提供程序无法识别
- Angular 10:为延迟加载的模块创建捆绑包
- Angular 2如何为延迟加载的模块提供单例服务
- Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?
angular – 如何为所有延迟加载的模块提供自定义提供程序(angular按需加载)
providers:[{ provide: Http,useFactory: (backend: XHRBackend,defaultOptions: RequestOptions,cookieService: CookieService) => new CustomHttp(backend,defaultOptions,cookieService),deps: [XHRBackend,RequestOptions,CookieService] }]
我的延迟加载模块不会影响此自定义提供程序.有没有办法为他们提供?没有在component.module文件的providers属性中重复代码.谢谢!
每个延迟加载的模块都有自己的注入器,因此它对应用程序级别中的扩展Http提供程序一无所知.当您在服务中注入Http提供程序时(在延迟加载的模块中),angular正在尝试在模块的注入器中找到Http提供程序…并从’@ angular / http’中找到原始提供程序.但是您需要找到在应用程序级别内“可见”的扩展Http提供程序.
所以尝试在构造函数中在Http之前添加@SkipSelf():
import { SkipSelf } from '@angular/core'; constructor(@SkipSelf() private http: Http) { }
android – IQ自定义提供程序无法识别
经过大量研究后,我发现Openfire不支持消息归档并安装了插件OpenArchive.
现在归档工作正常,所有消息都存储得很好.
现在在客户端,我尝试发送一个IQ节来检索存档的聊天记录.
首先,我添加了一个IQ Provider,如下所示:
pm.addIQProvider(“list”,“urn:xmpp:archive”,new ListIQProvider());
然后我用了:
final IQ iq = new IQ() { @Override public String getChildElementXML() { return "<list xmlns=''urn:xmpp:archive'' with=''test@customOpenfire.com''><set xmlns=''http://jabber.org/protocol/rsm''><max xmlns=''http://jabber.org/protocol/rsm''>30</max></set> </list>"; } }; iq.setType(IQ.Type.GET); iq.setPacketID("987654321"); xmppConnection.sendPacket(iq);
它工作正常,我收到了答复.
<iq id="987654321" to="admin@customOpenfire.com/Smack" type="result"> <list xmlns="urn:xmpp:archive"> <chat with="test@customOpenfire.com" start="2014-04-06T12:11:28.674Z"/> <chat with="test@customOpenfire.com" start="2014-04-03T16:55:59.523Z"/> <chat with="test@customOpenfire.com" start="2014-04-05T16:33:03.377Z"/> <chat with="test@customOpenfire.com" start="2014-04-02T14:32:10.499Z"/> <chat with="test@customOpenfire.com" start="2014-04-06T12:47:52.961Z"/> <chat with="test@customOpenfire.com" start="2014-04-03T14:46:24.877Z"/> <chat with="test@customOpenfire.com" start="2014-04-06T12:37:14.608Z"/> <chat with="test@customOpenfire.com" start="2014-04-03T15:48:46.642Z"/> <chat with="test@customOpenfire.com" start="2014-04-02T13:46:07.750Z"/> <chat with="test@customOpenfire.com" start="2014-04-04T18:25:57.968Z"/> <chat with="test@customOpenfire.com" start="2014-04-03T19:08:45.238Z"/> <chat with="test@customOpenfire.com" start="2014-04-04T18:47:19.067Z"/> <chat with="test@customOpenfire.com" start="2014-04-04T19:34:27.819Z"/> <chat with="test@customOpenfire.com" start="2014-04-02T15:09:13.140Z"/> <chat with="test@customOpenfire.com" start="2014-04-03T18:30:36.804Z"/> <chat with="test@customOpenfire.com" start="2014-04-05T14:09:34.973Z"/> <chat with="test@customOpenfire.com" start="2014-04-04T22:47:54.363Z"/> <chat with="test@customOpenfire.com" start="2014-04-02T15:32:44.540Z"/> <chat with="test@customOpenfire.com" start="2014-04-03T17:18:37.940Z"/> <chat with="test@customOpenfire.com" start="2014-04-03T13:37:15.630Z"/> <chat with="test@customOpenfire.com" start="2014-04-04T17:10:39.116Z"/> <set xmlns="http://jabber.org/protocol/rsm"> <first index="0">66</first> <last>139</last> <count>21</count> </set> </list> </iq>
然后我想检索实际的消息,所以我发送了这个IQ节:
final IQ iq = new IQ() { @Override public String getChildElementXML() { return "<retrieve xmlns=''urn:xmpp:archive'' with=''test@customOpenfire.com''><set xmlns=''http://jabber.org/protocol/rsm''><max xmlns=''http://jabber.org/protocol/rsm''>30</max></set> </retrieve>"; } }; iq.setType(IQ.Type.GET); iq.setPacketID("987654321"); xmppConnection.sendPacket(iq);
当然,在我创建自定义提供程序后,如下所示添加它:
pm.addIQProvider("retrieve","urn:xmpp:archive",new ChatIQProvider());
我应该收到类似的东西:
<iq xmlns="jabber:client" type="result" id="hgfg" to="admin@customOpenfire.com/7dd0f2fc"> <chat xmlns="urn:xmpp:archive" with="test@customOpenfire.com" start="2014-04-02T13:46:07.750Z"> <from secs="0" jid="test@customOpenfire.com"> <body>hello</body> </from> <to secs="2"> <body>hey</body> </to> <from secs="5" jid="test@customOpenfire.com"> <body>test</body> </from> <set xmlns="http://jabber.org/protocol/rsm"> <first index="0">0</first> <last>2</last> <count>3</count> </set> </chat>
但是在我的数据包侦听器中,结果未被解析,并且如果我删除ListIQProvider(),就像处理list节一样对待它.
这是我的自定义类:
ChatIQ:
public class ChatIQ extends IQ { private String xmlns; private String with; private String start; private List<From> froms; private Set set; public ChatIQ() { this.froms = new ArrayList<ChatIQ.From>(); } public String getXmlns() { return xmlns; } public void setXmlns(String xmlns) { this.xmlns = xmlns; } public String getWith() { return with; } public void setWith(String with) { this.with = with; } public String getStart() { return start; } public void setStart(String start) { this.start = start; } public void addFrom(From from) { froms.add(from); } public List<From> getFroms() { return froms; } public Set getSet() { return set; } public void setSet(Set set) { this.set = set; } @Override public String getChildElementXML() { StringBuilder builder = new StringBuilder("<chat xmlns=\"urn:xmpp:archive\""); builder.append("with=\"").append(with).append("\""); builder.append(" start=\""); builder.append(start); builder.append("\">"); for(From from : froms) { builder.append(from.toXml()); } builder.append(set.toXml()); builder.append("</chat>"); return builder.toString(); } public static class From { private String secs; private String jid; private Body body; public String getSecs() { return secs; } public void setSecs(String secs) { this.secs = secs; } public String getJid() { return jid; } public void setJid(String jid) { this.jid = jid; } public Body getBody() { return body; } public void setBody(Body body) { this.body = body; } public String toXml() { StringBuilder builder = new StringBuilder("<from "); builder.append("secs=\"").append(secs).append("\" "); builder.append("jid=\"").append(jid).append("\" >"); builder.append(body.toXml()); builder.append("</from>"); return builder.toString(); } } public static class Body { private String message; public Body(String message) { this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object toXml() { StringBuilder builder = new StringBuilder("<body>"); builder.append(message); builder.append("</body>"); return builder.toString(); } } public static class Set { private int last; private int count; private int indexAtt; private int first; public Set() { } public int getLast() { return last; } public void setLast(int last) { this.last = last; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public int getIndexAtt() { return indexAtt; } public void setIndexAtt(int indexAtt) { this.indexAtt = indexAtt; } public int getFirst() { return first; } public void setFirst(int first) { this.first = first; } public String toXml() { StringBuilder builder = new StringBuilder("<set xmlns=\"http://jabber.org/protocol/rsm\">"); builder.append("<first index=\"").append(indexAtt).append("\">").append(first).append("</first>"); builder.append("<last>").append(last).append("</last>"); builder.append("<count>").append(count).append("</count>"); builder.append("</set>"); return builder.toString(); } } }
ChatIQProvider:
public class ChatIQProvider implements IQProvider { public ChatIQProvider() { } @Override public IQ parseIQ(XmlPullParser parser) throws Exception { Log.d("CHAT IQ PROVIDER",String.format("Received iq packet,namespace[%s],name[%s]",parser.getNamespace(),parser.getName())); ChatIQ iq = new ChatIQ(); ChatIQ.Set set = new Set(); boolean done = false; From from = new From(); String secs = "",jid = ""; while (!done) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("from")) { secs = parser.getAttributeValue("","secs"); jid = parser.getAttributeValue("","jid"); from = new From(); iq.addFrom(from); } else if(parser.getName().equals("body") && from.getBody()==null) { ChatIQ.Body body = new Body(parser.nextText()); from.setBody(body); } else if (parser.getName().equals("first")) { int index = parseInt(parser.getAttributeValue("","index")); set.setIndexAtt(index); int first = parseInt(parser.nextText()); set.setFirst(first); } else if (parser.getName().equals("last")) { int last = parseInt(parser.nextText()); set.setLast(last); } else if (parser.getName().equals("count")) { int count = parseInt(parser.nextText()); set.setCount(count); } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals("chat")) { iq.setSet(set); done = true; } } } return iq; } private int parseInt(String integer) { return Integer.parseInt((integer != null ? integer : "0")); } }
我的问题如下:
>为什么我的自定义IQProvider不被识别?
>我可以获取收到的XML并解析它而无需通过IQproviders吗?
>是否有更简单的方法从服务器检索存档的消息?知道消息存在并且我确实在客户端接收它们,我就找不到获取内容并解析它的方法.
谢谢.
解决方法
无论如何,修复非常简单.代替:
pm.addIQProvider("retrieve",new ChatIQProvider());
我应该用过:
pm.addIQProvider("chat",new ChatIQProvider());
我必须注册IQ响应的子标记的名称而不是请求,因此“聊天”而不是“检索”.
希望这会有所帮助,因为我在android smack api中找不到任何关于使用自定义IQ的例子.
由于评论太长,我在这里添加了它.
干得好:
ListIQProvider:
public class ListIQProvider implements IQProvider { public ListIQProvider() { } @Override public IQ parseIQ(XmlPullParser parser) throws Exception { ListIQ iq = new ListIQ(); ListIQ.Set set = new Set(); boolean done = false; String with = "",start = ""; while (!done) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("chat")) { with = parser.getAttributeValue("","with"); start = parser.getAttributeValue("","start"); iq.addChat(new Chat(with,start)); } else if (parser.getName().equals("first")) { int index = parseInt(parser.getAttributeValue("","index")); set.setIndexAtt(index); int first = parseInt(parser.nextText()); set.setFirst(first); } else if (parser.getName().equals("last")) { int last = parseInt(parser.nextText()); set.setLast(last); } else if (parser.getName().equals("count")) { int count = parseInt(parser.nextText()); set.setCount(count); } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals("list")) { iq.setSet(set); done = true; } } } return iq; } private int parseInt(String integer) { return Integer.parseInt((integer != null ? integer : "0")); }
}
ListIQ:
public class ListIQ extends IQ { private List<Chat> chats; private Set set; public ListIQ() { this.chats = new ArrayList<ListIQ.Chat>(); } public Set getSet() { return set; } public void setSet(Set set) { this.set = set; } public void addChat(Chat chat) { chats.add(chat); } public List<Chat> getChats() { return chats; } @Override public String getChildElementXML() { StringBuilder builder = new StringBuilder("<list xmlns=\"urn:xmpp:archive\">"); for (Chat chat : chats) { builder.append(chat.toXml()); } builder.append(set.toXml()); builder.append("</list>"); return builder.toString(); } public static class Chat { private String with; private String start; public Chat() { } public Chat(String with,String start) { this.with = with; this.start = start; } public String getWith() { return with; } public void setWith(String with) { this.with = with; } public String getStart() { return start; } public void setStart(String start) { this.start = start; } public String toXml() { StringBuilder builder = new StringBuilder("<chat with=\""); builder.append(with).append("\""); builder.append(" start=\""); builder.append(start); builder.append("\"/>"); return builder.toString(); } } public static class Set { private int last; private int count; private int indexAtt; private int first; public Set() { } public int getLast() { return last; } public void setLast(int last) { this.last = last; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public int getIndexAtt() { return indexAtt; } public void setIndexAtt(int indexAtt) { this.indexAtt = indexAtt; } public int getFirst() { return first; } public void setFirst(int first) { this.first = first; } public String toXml() { StringBuilder builder = new StringBuilder("<set xmlns=\"http://jabber.org/protocol/rsm\">"); builder.append("<first index=\"").append(indexAtt).append("\">").append(first).append("</first>"); builder.append("<last>").append(last).append("</last>"); builder.append("<count>").append(count).append("</count>"); builder.append("</set>"); return builder.toString(); } } }
我只是使用这个类来调用ServiceProviders.Register_Providers(ProviderManager.getInstance());在连接Xmpp连接之后.
服务供应商:
public class ServiceProviders { public static void Register_Providers(ProviderManager pm) { Log.e("PROVIDER","START"); // Private Data Storage pm.addIQProvider("query","jabber:iq:private",new PrivateDataManager.PrivateDataIQProvider()); // Time try { pm.addIQProvider("query","jabber:iq:time",Class.forName("org.jivesoftware.smackx.packet.Time")); } catch (ClassNotFoundException e) { Log.w("TestClient","Can''t load class for org.jivesoftware.smackx.packet.Time"); } // Roster Exchange pm.addExtensionProvider("x","jabber:x:roster",new RosterExchangeProvider()); // Message Events pm.addExtensionProvider("x","jabber:x:event",new MessageEventProvider()); // Chat State pm.addExtensionProvider("active","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider()); pm.addExtensionProvider("composing",new ChatStateExtension.Provider()); pm.addExtensionProvider("paused",new ChatStateExtension.Provider()); pm.addExtensionProvider("inactive",new ChatStateExtension.Provider()); pm.addExtensionProvider("gone",new ChatStateExtension.Provider()); // XHTML pm.addExtensionProvider("html","http://jabber.org/protocol/xhtml-im",new XHTMLExtensionProvider()); // Group Chat Invitations pm.addExtensionProvider("x","jabber:x:conference",new GroupChatInvitation.Provider()); // Service discovery # Items pm.addIQProvider("query","http://jabber.org/protocol/disco#items",new discoverItemsProvider()); // Service discovery # Info pm.addIQProvider("query","http://jabber.org/protocol/disco#info",new discoverInfoProvider()); // Data Forms pm.addExtensionProvider("x","jabber:x:data",new DataFormProvider()); // MUC User pm.addExtensionProvider("x","http://jabber.org/protocol/muc#user",new MUCUserProvider()); // MUC Admin pm.addIQProvider("query","http://jabber.org/protocol/muc#admin",new MUCAdminProvider()); // MUC Owner pm.addIQProvider("query","http://jabber.org/protocol/muc#owner",new MUCOwnerProvider()); // Delayed Delivery pm.addExtensionProvider("x","jabber:x:delay",new DelayinformationProvider()); // Version try { pm.addIQProvider("query","jabber:iq:version",Class.forName("org.jivesoftware.smackx.packet.Version")); } catch (ClassNotFoundException e) { // Not sure what''s happening here. } // VCard pm.addIQProvider("vCard","vcard-temp",new VCardProvider()); // Offline Message Requests pm.addIQProvider("offline","http://jabber.org/protocol/offline",new OfflineMessageRequest.Provider()); // Offline Message Indicator pm.addExtensionProvider("offline",new OfflineMessageInfo.Provider()); // Last Activity pm.addIQProvider("query","jabber:iq:last",new LastActivity.Provider()); // User Search pm.addIQProvider("query","jabber:iq:search",new UserSearch.Provider()); // SharedGroupsInfo pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup",new SharedGroupsInfo.Provider()); // JEP-33: Extended Stanza Addressing pm.addExtensionProvider("addresses","http://jabber.org/protocol/address",new MultipleAddressesProvider()); // FileTransfer pm.addIQProvider("si","http://jabber.org/protocol/si",new StreamInitiationProvider()); pm.addIQProvider("query","http://jabber.org/protocol/bytestreams",new BytestreamsProvider()); // Privacy pm.addIQProvider("query","jabber:iq:privacy",new PrivacyProvider()); pm.addIQProvider("command","http://jabber.org/protocol/commands",new AdHocCommandDataProvider()); pm.addExtensionProvider("malformed-action",new AdHocCommandDataProvider.MalformedActionError()); pm.addExtensionProvider("bad-locale",new AdHocCommandDataProvider.BadLocaleError()); pm.addExtensionProvider("bad-payload",new AdHocCommandDataProvider.BadPayloadError()); pm.addExtensionProvider("bad-sessionid",new AdHocCommandDataProvider.BadSessionIDError()); pm.addExtensionProvider("session-expired",new AdHocCommandDataProvider.SessionExpiredError()); pm.addIQProvider("query",new discoverInfoProvider()); pm.addExtensionProvider("x",new DataFormProvider()); // archive pm.addIQProvider("list",new ListIQProvider()); pm.addIQProvider("chat",new ChatIQProvider()); } }
@HirenPatel
首先,您需要将存档插件添加到Openfire.
然后在客户端中的Xmpp连接之后,您必须注册您的提供程序,包括帮助检索聊天消息的提供程序:
pm.addIQProvider("list",new ListIQProvider()); pm.addIQProvider("chat",new ChatIQProvider());
然后你需要发送一个IQ节,如下所示:
final IQ iq = new IQ() { @Override public String getChildElementXML() { return "<retrieve xmlns=''urn:xmpp:archive'' with=''test@customOpenfire.com''><set xmlns=''http://jabber.org/protocol/rsm''><max xmlns=''http://jabber.org/protocol/rsm''>30</max></set> </retrieve>"; } }; iq.setType(IQ.Type.GET); iq.setPacketID("987654321"); xmppConnection.sendPacket(iq);
Angular 10:为延迟加载的模块创建捆绑包
如何解决Angular 10:为延迟加载的模块创建捆绑包?
我有一个使用xslx库创建Excel报告的服务。由于xlsx很大,并且只能在一个地方使用,因此我想将服务以及依赖项放入延迟加载的模块中。
到目前为止,一切正常:我将模块懒惰地加载到需要的地方,然后从模块注入器获取服务。现在的问题是获取服务实例,我需要将其导入使用组件的组件中。一旦执行此操作,xlsx就会被捆绑到使用该服务的模块中,而不是捆绑到延迟加载的模块中。
有什么想法吗?
Thx 马库斯
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Angular 2如何为延迟加载的模块提供单例服务
According to the docs:
The SharedModule should only provide the UserService when imported by
the root AppModule. The SharedModule.forRoot method helps us meet this
challenge…the SharedModule does not haveproviders
…When we add
the SharedModule to the imports of the AppModule,we call forRoot. In
doing so,the AppModule gains the exported classes and the
SharedModule delivers the singletonUserService
provider at the same
time
我真的很挣扎如何为延迟加载的路由提供第三方服务(我的AppModule的导入数组中的模块使用的服务).我无法控制这个第三方模块,因此我不能从该模块的NgModule.providers数组中删除该服务,并将其放在RouterModule.forRoot()中,就像我使用其中一个服务一样.
具体服务是MdIconRegistry,它是Angular Material 2 alpha 7-3的MdIconModule的提供者.此服务用于注册svg图标,然后可以使用< md-icon svgIcon ='iconName'>显示在页面上.标签.所以:
>我在我的根AppModule中导入了MdIconModule
>我使用有问题的服务在我的AppComponent中注册svg图标
该图标可见并且运行良好,但仅适用于启动时加载的模块.延迟加载的模块无法看到这些图标,因此我怀疑Angular注入器没有注入MdIconRegistry服务的同一个实例.
tl; dr:我如何从第三方模块使服务可用于我的延迟加载组件?
Here is a plunker that demonstrates the problem(用打字稿编码).
PS:这引起了MdIconModule开发人员on github.的注意
I do not think it has anything to do with the component being lazy-loaded.
LazyLoadedComponent不是AppModule的一部分 – 它是LazyModule的一部分.根据文档,组件只能是一个模块的一部分.如果您也尝试将LazyLoadedComponent添加到AppModule,则会收到相应的错误.所以LazyLoadedComponent甚至根本没有看到MdIconModule.您可以通过查看调试器中的模板输出来确认这一点 – 它保持不变.
<md-icon svgIcon="play"></md-icon>
解决方案似乎是将MdIconModule添加到LazyModule,虽然仅此一项不能解决问题,但它确实会在输出中添加错误.
Error retrieving icon: Error: Unable to find icon with the name “:play”
现在模板输出看起来像这样,所以我们知道它正在加载.
<md-icon role="img" svgicon="play" ng-reflect-svg-icon="play" aria-label="play"></md-icon>
我从LazyLoadedComponent添加了对addSvgIconSet的调用,并且它使它工作……所以这证明每个组件有一个MdIconRegistry服务的实例 – 不是你想要的,但可能指向正确的方向.
这是新款 – http://plnkr.co/edit/YDyJYu?p=preview
经过进一步审查,我在docs发现了这个:
Why is a service provided in a lazy loaded module visible only to that module?
Unlike providers of the modules loaded at launch,providers of lazy loaded modules are module-scoped.
最后更新!这是答案.没有为延迟加载的组件正确设置MdIconModule …但是我们可以轻松创建我们自己的模块,该模块已正确设置并使用它.
import { NgModule } from '@angular/core'; import { HttpModule } from '@angular/http'; import { MdIcon } from '@angular2-material/icon'; import { MdIconRegistry } from '@angular2-material/icon'; @NgModule({ imports: [HttpModule],exports: [MdIcon],declarations: [MdIcon] }) export class MdIconModuleWithProviders { static forRoot(): ModuleWithProviders { return { ngModule: MdIconModuleWithProviders,providers: [ MdIconRegistry ] }; } }
Plunk更新并完全正常工作. (对不起,更新了同一个) – > http://plnkr.co/edit/YDyJYu?p=preview
有人可能会提交拉取请求,以便Angular Material导出两种样式的模块.
Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?
@NgModule({ providers: [ {provide: AbstractClassService,useClass: ExtendedClassService} ] }) export class AppModule {}
这将允许我将ExtendedClassService与另一个进行切换以进行测试或非常容易.这仍然可以使用Angular 6完成,但是有一个新的providedIn选项可以在服务本身中设置以减少包大小:
@Injectable({providedIn: 'root'}) export class ExtendedClassService extends AbstractClassService {}
有没有办法让我在使用新的provideIn时完成与Angular 5相同的操作?像这样的东西:
@Injectable({providedIn: 'root',provide: AbstractClassService}) export class ExtendedClassService extends AbstractClassService {}
首先,在创建继承类时使用implements而不是extends,并且不要在那里使用providedIn键:
@Injectable() // removed providedIn export class ExtendedClassService implements AbstractClassService {}
其次,将提供者指令添加到抽象类中:
@Injectable({providedIn: 'root',useClass: ExtendedClassService}) export abstract class AbstractClassService {}
其他提供程序配置(useValue,useExisting,useFactory)也可以在那里使用.
凭借this comment获得Abinesh的信用,这使我获得了the linked blog post.非常感谢博客作者!
关于angular – 如何为所有延迟加载的模块提供自定义提供程序和angular按需加载的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – IQ自定义提供程序无法识别、Angular 10:为延迟加载的模块创建捆绑包、Angular 2如何为延迟加载的模块提供单例服务、Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?等相关内容,可以在本站寻找。
本文标签: