GVKun编程网logo

angular – 如何为所有延迟加载的模块提供自定义提供程序(angular按需加载)

15

关于angular–如何为所有延迟加载的模块提供自定义提供程序和angular按需加载的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android–IQ自定义提供程序无法识别、Angul

关于angular – 如何为所有延迟加载的模块提供自定义提供程序angular按需加载的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – IQ自定义提供程序无法识别、Angular 10:为延迟加载的模块创建捆绑包、Angular 2如何为延迟加载的模块提供单例服务、Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

angular – 如何为所有延迟加载的模块提供自定义提供程序(angular按需加载)

angular – 如何为所有延迟加载的模块提供自定义提供程序(angular按需加载)

我在我的应用程序中使用子组件的延迟加载策略.在应用程序的顶层,我有自定义HTTP提供程序,它拦截所有ajax调用.
providers:[{
        provide: Http,useFactory: (backend: XHRBackend,defaultOptions: RequestOptions,cookieService: CookieService) => new CustomHttp(backend,defaultOptions,cookieService),deps: [XHRBackend,RequestOptions,CookieService]
    }]

我的延迟加载模块不会影响此自定义提供程序.有没有办法为他们提供?没有在component.module文件的providers属性中重复代码.谢谢!

我用 @SkipSelf()修复了它.
每个延迟加载的模块都有自己的注入器,因此它对应用程序级别中的扩展Http提供程序一无所知.当您在服务中注入Http提供程序时(在延迟加载的模块中),angular正在尝试在模块的注入器中找到Http提供程序…并从’@ angular / http’中找到原始提供程序.但是您需要找到在应用程序级别内“可见”的扩展Http提供程序.
所以尝试在构造函数中在Http之前添加@SkipSelf():
import { SkipSelf } from '@angular/core';

constructor(@SkipSelf() private http: Http) {
}

android – IQ自定义提供程序无法识别

android – IQ自定义提供程序无法识别

我在Openfire中使用了一个思科.

经过大量研究后,我发现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:为延迟加载的模块创建捆绑包

如何解决Angular 10:为延迟加载的模块创建捆绑包?

我有一个使用xslx库创建Excel报告的服务。由于xlsx很大,并且只能在一个地方使用,因此我想将服务以及依赖项放入延迟加载的模块中。

到目前为止,一切正常:我将模块懒惰地加载到需要的地方,然后从模块注入器获取服务。现在的问题是获取服务实例,我需要将其导入使用组件的组件中。一旦执行此操作,xlsx就会被捆绑到使用该服务的模块中,而不是捆绑到延迟加载的模块中。

有什么想法吗?

Thx 马库斯

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Angular 2如何为延迟加载的模块提供单例服务

Angular 2如何为延迟加载的模块提供单例服务

根据我对Angular 2 rc5的理解,要从另一个模块(不是AppModule)提供服务作为单个模块提供给每个组件,即使是那些延迟加载的模块,我们也不会将该服务包含在该其他模块的providers数组中.我们改为使用RouterModule.forRoot()导出它并将结果导入AppModule

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 have providers…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 singleton UserService 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()提供程序以进行依赖注入?

Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?

在Angular 5中,如果我使用AbstractClassService和ExtendedClassService来扩展抽象,我可以在我的NgModule的providers数组中执行此操作:
@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()提供程序以进行依赖注入?等相关内容,可以在本站寻找。

本文标签: