使用 angularjs 在 Office 加载项中 Office.initialize 的正确方法
Correct way to Office.initialize in Office add-ins with angularjs
我想使用 angular 和 angular-ui-路由器构建一个 Office 插件。我不知道放置 Office.initialize
.
的正确位置是什么
目前,我使用 index.html
:
<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
<script src="https://cdn.rawgit.com/devote/HTML5-History-API/master/history.js"></script>
<script src="/javascripts/angularApp.js"></script>
...
<body ng-app="myApp">
<ui-view ng-cloak></ui-view>
</body>
和angularApp.js
:
Office.initialize = function (reason) {
$(document).ready(function () {
angular.element(document).ready(function () {
angular.bootstrap(document, ['myApp'])
})
});
}
var app = angular.module('myApp', ['ui.router', 'ui.bootstrap'])
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider
.state('ttt', {
url: '/ttt',
template: 'ttt',
controller: 'tttCtrl'
})
.state('addinTest', {
url: '/addin/test',
template: '<a href="ttt" target="_self">ttt</a><br/><br/><a href="addin/another" target="_self">another page</a>'
})
}])
app.controller('tttCtrl', [function() {
console.log('console ttt')
}])
和manifest.xml
:
<bt:Url id="Contoso.Taskpane3.Url" DefaultValue="https://localhost:3000/addin/test" />
所以加载加载项显示 test
页面有 2 个按钮。单击 ttt
会加载 ttt
页面。 但是我的测试显示console ttt
显示了两次
如果我从 Office.initialize
中删除 angular.element(document).ready(...)
,console ttt
只会正确显示一次。但是,当打开与 Excel 交互的 another
页面时,出现错误:Office.context is undefined
.
那么谁能告诉我是否应该使用 angular.bootstrap(...)
?使用 angularjs 在 Office 加载项中执行 Office.initialize
的正确方法是什么?许多随机的奇怪行为因此而发生......
控制台ttt显示两次的原因是我同时有<body ng-app="myApp">
和angular.bootstrap。
If I remove angular.element(document).ready(...) from Office.initialize, console ttt is correctly displayed only once. However, when opening another page which interacts with Excel, I got an error: Office.context is undefined.
我没有测试过,但是完全删除 Office.initialize
块并保留 <body ng-app="myApp">
可能会解决问题...
正确的方法是您必须在 Office.initialize
中手动启动您的 AngularJS 应用程序
RouteConfig.js
Office.initialize = function () {
//load angular app after office has been initialized
angular.bootstrap($('#TSRApp'), ['TSRApp']);
}
var app = angular.module("TSRApp", ["ngRoute"]);
app.config(function ($routeProvider) {
$routeProvider
.when("/", {
templateUrl: "../Home/Index.html"
})
.when("/settings", {
templateUrl: "../Settings/Index.html"
})
.when("/message", {
templateUrl: "../MessageRead/MessageRead.html"
});
});
我想使用 angular 和 angular-ui-路由器构建一个 Office 插件。我不知道放置 Office.initialize
.
目前,我使用 index.html
:
<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
<script src="https://cdn.rawgit.com/devote/HTML5-History-API/master/history.js"></script>
<script src="/javascripts/angularApp.js"></script>
...
<body ng-app="myApp">
<ui-view ng-cloak></ui-view>
</body>
和angularApp.js
:
Office.initialize = function (reason) {
$(document).ready(function () {
angular.element(document).ready(function () {
angular.bootstrap(document, ['myApp'])
})
});
}
var app = angular.module('myApp', ['ui.router', 'ui.bootstrap'])
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider
.state('ttt', {
url: '/ttt',
template: 'ttt',
controller: 'tttCtrl'
})
.state('addinTest', {
url: '/addin/test',
template: '<a href="ttt" target="_self">ttt</a><br/><br/><a href="addin/another" target="_self">another page</a>'
})
}])
app.controller('tttCtrl', [function() {
console.log('console ttt')
}])
和manifest.xml
:
<bt:Url id="Contoso.Taskpane3.Url" DefaultValue="https://localhost:3000/addin/test" />
所以加载加载项显示 test
页面有 2 个按钮。单击 ttt
会加载 ttt
页面。 但是我的测试显示console ttt
显示了两次
如果我从 Office.initialize
中删除 angular.element(document).ready(...)
,console ttt
只会正确显示一次。但是,当打开与 Excel 交互的 another
页面时,出现错误:Office.context is undefined
.
那么谁能告诉我是否应该使用 angular.bootstrap(...)
?使用 angularjs 在 Office 加载项中执行 Office.initialize
的正确方法是什么?许多随机的奇怪行为因此而发生......
控制台ttt显示两次的原因是我同时有<body ng-app="myApp">
和angular.bootstrap。
If I remove angular.element(document).ready(...) from Office.initialize, console ttt is correctly displayed only once. However, when opening another page which interacts with Excel, I got an error: Office.context is undefined.
我没有测试过,但是完全删除 Office.initialize
块并保留 <body ng-app="myApp">
可能会解决问题...
正确的方法是您必须在 Office.initialize
中手动启动您的 AngularJS 应用程序RouteConfig.js
Office.initialize = function () {
//load angular app after office has been initialized
angular.bootstrap($('#TSRApp'), ['TSRApp']);
}
var app = angular.module("TSRApp", ["ngRoute"]);
app.config(function ($routeProvider) {
$routeProvider
.when("/", {
templateUrl: "../Home/Index.html"
})
.when("/settings", {
templateUrl: "../Settings/Index.html"
})
.when("/message", {
templateUrl: "../MessageRead/MessageRead.html"
});
});