【问题标题】:Wait for jQuery document.Ready() in angular2 service在 angular2 服务中等待 jQuery document.Ready()
【发布时间】:2016-10-28 18:16:22
【问题描述】:

我有一个 angular2(带有 angular-cli)应用程序,它将存在于由 CMS (DotnetNuke) 提供的网站的网页中。这个 web cms 使用 jquery 的服务框架来为网站“后端”的 api 调用生成一个验证令牌。因此,在获得此验证令牌之前,我无法生成对网站的任何 Web api 调用。

我创建了一个服务来处理对网站 API 的调用。在服务的构造函数中,我尝试按以下方式设置令牌(ServicesFramework 对象有一个名为 getAntiForgeryValue 的函数,它返回令牌)

@Injectable()
export class ApiService {

    private http: Http;

    constructor(http: Http) 
    {
        console.log('dnn service constructor');

        $(document).ready(function () {
            this._dnnSF = $.ServicesFramework(804);
        });
    }

    getRequestVerificationToken(): any {
        return this._dnnSF.getAntiForgeryValue();        
    };
}

ServicesFramework 的 getAntiForgeryValue() 只返回 jQuery __RequestVerificationToken 用于对 .net web api 端点的 ajax 调用。 这只是为了解释。

问题:

注入此服务的其他组件在服务构造函数中的 document.ready 完成之前调用 getAntiForgeryValue(),因此我得到:

无法读取未定义的属性“getAntiForgeryValue”

问题: 有人可以帮我制定一个使用 angular2 的策略,我可以在 Angular 应用程序运行之前等待提供此验证令牌,或者如何在服务中等待构造函数完成。

提前致谢

【问题讨论】:

  • 为什么投反对票?来吧,如果您投反对票,请提供理由。

标签: jquery angular angular-cli


【解决方案1】:

该错误意味着:$.ServicesFramework 未定义。您需要找到一种方法将其注入 Angular 世界。一种方法(不推荐但很快)是在 Angular 之外的全局范围内声明它: window.framework = $.ServicesFramework;

然后在您的服务顶部声明它: const framework;

然后在你的构造函数中你可以这样做: constructor(http: Http) { this._dnnSF = framework; }

List 我说过这又快又脏。更好的方法是在引导 Angular 应用程序时注入外部组件。

【讨论】:

  • 感谢博彦,我以前使用不透明令牌并将 $.ServicesFramework 注入根 ngModule 的提供程序中。但是提供商抱怨 $.ServicesFramework 的值未定义。它似乎不想提供/注入尚未定义的对象。这就是为什么我试图改变我的方法。我会试试你的。
  • 您最初的方法是更好的方法。如果你想在 bootstrap 上注入模块,但它不能以正确的方式使用,你需要使用一个等待外部组件加载的 Promise 来完成,并在 Promise 回调中,引导你的应用程序并注入准备好的对象.来自另一个答案的更多信息。 stackoverflow.com/questions/37611549/…
猜你喜欢
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多