私は、この問題に関するほとんどの質問は、angular.element($document).ready
という角度でのjQuery $(document).ready
関数の代替案に関するものですが、テスト可能な/ベストプラクティスの代替これに。angular.element(document)の代わりに.ready
現在、コントローラのコードが実行される前にロードする必要があるBing Mapsを注入しています。作品
angular.element($document).ready(function() {
self.map = new Microsoft.Maps.Map(document.getElementById('map'), {
credentials: $scope.credentials,
enableClickableLogo: false,
enableSearchLogo: false,
showDashboard: false,
disableBirdseye: true,
allowInfoboxOverflow: true,
liteMode: true,
minZoom: 2
});
$scope.$watch('zoom', function (zoom) {
self.map.setView({animate: true, zoom: zoom});
});
if ($scope.onMapReady) {
$scope.onMapReady({ map: self.map });
}
});
を、しかし、私はそれをテストすることができないので、私は、これは間違った用法であると仮定します。
は、現在、私は準備ができて、文書内のコントローラコードをラップします。 ディレクティブに変数を設定しようとしましたが、$scope.loaded = true;
です。ディレクティブリンク関数がヒットした場合は、DOMをロードする必要があります。 「ロードされた」時計は期待通りに動作しますが、マップが設定される前に自然にズームが負荷とのthatsにヒットした
$scope.$watch('loaded', function() {
self.map = new Microsoft.Maps.Map(document.getElementById('map'), {
credentials: $scope.credentials,
enableClickableLogo: false,
enableSearchLogo: false,
showDashboard: false,
disableBirdseye: true,
allowInfoboxOverflow: true,
liteMode: true,
minZoom: 2
});
if ($scope.onMapReady) {
$scope.onMapReady({ map: self.map });
}
});
$scope.$watch('zoom', function (zoom) {
self.map.setView({animate: true, zoom: zoom});
});
:私はその後で準備ができて文書を交換してみました。私は文書を$timeout
機能に変えることができるように感じますが、正しい解決策ではなく回避策であると思われます。angular.element($document).ready
の代わりにベストプラクティスの代わりに同じ方法で動作しますが、内容を正しくテストできますか?
このコードのコンテキストは何ですか?通常、角度のあるアプリはドキュメントの準備ができたらブートストラップする必要があるので、このラッパーは少なくともコントローラーの中では役に立たない。 – estus
@estus bing mapsは以下のように呼び出されます: ''一度読み込まれると、上記のスニペットの 'Microsoft'にアクセスできます。これは、doc内のコントローラー内にのみ存在するように見えます。 – gardni
APIを公開せずに可能であれば、フィーリング/ plunkとして問題を再現する方法を提供してくださいキーか何か。一般的に、答えは「あなたはangular.bootstrapで一度しか準備をしてはいけません」です。だから、特定のスクリプトとやりとりすることです。このAPI上に準備ができていることを確認するために接続できるイベントがある場合は、代わりにそれらを使用することを検討してください。 – estus