我应该如何将值从Office js函数传递给angular语法函数

时间:2018-09-25 15:06:12

标签: angular rest office-js outlook-web-addins

我已经在Angular 5中构建了一个Office Web Addin,现在我正在使用Office Rest Api,我遵循了use rest Api in Addins中的in文档

从文档中可以清楚地看出,我们可以使用令牌获取其余的api网址,该令牌是从在myComponent.ts

的Angular的 ngOnInit()中编写的函数中获得的
Office.context.mailbox.getCallbackTokenAsync({isRest: true}, function(result){
if (result.status === "succeeded") {
var accessToken = result.value;

// Use the access token
   getCurrentItem(accessToken);
  } else {
// Handle the error
  }
});

从上面的代码中我已经成功获取了accessToken并已在控制台中将其打印出来。现在的问题是我正在使用Angular 5,因此两者之间的语法冲突,因为如果我创建一个名为

的函数

getCurrentItem(accessToken)在Angular 5类中,我必须像上面的this.getCurrentItem(accessToken)那样调用它,从而引发错误

'this' is not defined

在这种情况下,我尝试在localStorage中设置accessToken并从类似的checkAccessToken函数中获取

 Office.context.mailbox.getCallbackTokenAsync({isRest: true}, function(result){
  if (result.status === "succeeded") {
    accessToken = result.value;
    localStorage.setItem('apiAccessToken',accessToken)
   // console.log(result.status)
   //this.getCurrentItem(accessToken)

  } else {
    console.log(result.status);
  }
});

 getAccessToken(){
   apiAccessToken:any = localStorage.getItem('apiAccessToken');
   console.log("API_Access_token : "+apiAccessToken);
 } 

所以现在在控制台中,我收到了INCOMPLETE Access_token,因为我第一次调用的任何REST调用都被拒绝访问,下一次我再次使用令牌调用相同的REST URL,因为它这次获得了完全访问权限Api令牌。

我可以理解,这是因为在等待Office getCallBackTokenAsync()函数完成之前,函数 getAccessToken()被调用了。

即使我不能在office函数中调用 getAccessToken(),因为它需要 this.getAccessToken(),这对于返回AccessToken的office函数是不可接受的,在那里实现它或等待 getCallBackTokenAsync() Office函数完成其调用的任何其他方式

1 个答案:

答案 0 :(得分:1)

getCallbackTokenAsync接受一个名为options的可选参数,该参数支持asyncContext属性。您可以传入具有getCurrentItem方法的对象实例。在您的回调函数中,该对象将在result参数中可用。更多信息here

以下示例代码可为您提供帮助:

let foo = new Foo();

Office.context.mailbox.getCallbackTokenAsync
(
    {
        "isRest" : false,
        "asyncContext" : foo
    },

    function (result)
    {
        if (asyncResult.status === Office.AsyncResultStatus.Succeeded)
        {
            let accessToken = result.value;
            localStorage.setItem('apiAccessToken',accessToken);
            console.log(result.status);
            result.asyncContext.getCurrentItem(accessToken);
        }
        else
        {
            console.log(result.status);
        }
    }
);