2017-08-01 48 views
5

Ortalama yığın web sitem var.

: o sayfanın içeriğini göstermektedir, butona

function doSomethingAndShowDialog(event) { 
    clickEvent = event; 
    Office.context.ui.displayDialogAsync("https://localhost:3000/try", {}, function() {}) 
} 

tıklamak aşağıdaki url içeren bir iletişim kutusu açar: Bir iletişim kutusunda bu web sitesi başlatmak için bir düğmeye bağlamak için ExecuteFunction kullanmak istiyorum

https://localhost:3000/try?_host_Info=excel|web|16.00|en-us|7fe9b4e9-d51e-bea5-d194-c817bc5ed4bc|isDialog#%2Ftry%3F_host_Info=excel%7Cweb%7C16.00%7Cen-us%7C7fe9b4e9-d51e-bea5-d194-c817bc5ed4bc%7CisDialog 

Ancak konsolunda, angular.bootstrap(document, ['myapp']) de Error: $rootScope:infdig Infinite $digest Loop vardır:

var wait = setTimeout(myFunction, 1000); 
Office.initialize = function (reason) { 
    $(document).ready(function() { 
     angular.bootstrap(document, ['myapp']) 
     console.log("bootstrapped inside Office.initialize"); 
     clearTimeout(wait); 
    }) 
} 

function myFunction() { 
    $(document).ready(function() { 
     angular.bootstrap(document, ['myapp']) 
     console.log("bootstrapped outside Office.initialize"); 
    }) 
} 

app = angular.module("myapp", []); 
app.config(...); 
app.controller(...); 

Eğer bir adı tarayıcı https://localhost:3000/try sadece açık r, hata yok.

Bu uzun URL'nin neden angular.bootstrap ile çalışmadığını bilen var mı? Bunu nasıl düzeltebiliriz?

Düzenleme 1:, konsolun https://localhost:3000/try?_host_Info=excel... konsolun bir ekran görüntüsü. Ne bootstrapped inside Office.initialize ne de bootstrapped outside Office.initialize görüntülendiğini unutmayın. Ancak bir tarayıcıda https://localhost:3000/try çalıştırırsam, bir Excel istemcisinden aradığımda yalnızca bootstrapped outside Office.initialize görürsem, yalnızca bootstrapped inside Office.initialize'u göreceğim.

enter image description here

+1

Modüllerinizi yükledikten veya tanımladıktan sonra angular.bootstrap() öğesini çağırmalısınız. Https://docs.angularjs.org/guide/bootstrap veya daha fazla ayrıntıya göz atın. – Vivz

+0

'myapp'' nerede ilan edildi? – 31piy

+1

“angular.bootstrap (document, ['myapp'])' ı çağırıyorsunuz. Bir kere önyükleme yapmalısın. –

cevap

1

Size bir eklenti veya tek başına bir sayfa olarak çalıĢabilir bir sayfa kadar Tel çalışıyoruz gibi geliyor. Mümkün olduğunda, her kullanım durumu için ayrı görünümleri korumak en iyisidir. Başka hiçbir şey yoksa, her şey çok daha düz bir şekilde ilerler. Onları birleştirmek, muhtemelen daha fazla yük ve baş ağrısı yaratıyor.

Sorununuzun bir kısmı, iki ayrı kod yolunuz olduğunu ve bir seferde yalnızca bir yolun yürütüleceğini varsayıyor olmanızdır. Bir tarayıcıya yüklendiğinde, bu doğrudur, Office.initialize işlevini görmezden gelir. Office içinde yüklendiğinde, ancak her iki yolu da yürütür. Biri Office tarafından icra edilecek, diğeri ise 1 saniye sonra setTimeOut tarafından yürütülecektir.

Yalnızca bir tanesinin yürütüldüğü iki ayrı kod yolunuz varsa, eklenti olarak mı, yoksa bağımsız bir sayfa olarak mı çalıştığınızı belirlemek için sınamanız gerekir. Bu sorgu parametrelerinin devreye girdiği yer burası. Tanımlanmış bir _host_Info sorgu parametreniz varsa, Office içinde çalışıyorsunuz demektir. Örneğin:

if (getParameterByName('_hostInfo')) { // _hostInfo is defined 
    Office.initialize = function (reason) { 
     $(document).ready(function() { 
      angular.bootstrap(document, ['myapp']) 
      console.log("bootstrapped inside Office.initialize"); 
     }); 
    } 
} 
else { // _hostInfo is not defined 
    $(document).ready(function() { 
     angular.bootstrap(document, ['myapp']) 
     console.log("bootstrapped outside Office.initialize"); 
    }) 
} 

Not getParameterByName() burada this answer çekilmiş bir işlevdir. Ancak, tercih ettiğiniz herhangi bir yöntemi kullanabilirsiniz.

+0

Cevabınız için teşekkür ederiz ... Sayfanın eklenti olarak mı yoksa bağımsız bir sayfa olarak mı çalıştığını kontrol etmek için bir işlev kullanmak istiyorum. Ama öyle görünüyor ki sadece 'ui yönlendirici' https: // localhost: 3000/try' ve 'https: // localhost: 3000/try? _host_Info ...' ayırt etmek için kullanabilirim ve sanmıyorum $ stateProvider.state (...) 'içinde 'angular.bootstrap' yazabilir miyiz? – SoftTimur