21

私の問題は、コントローラーが呼び出されてテンプレートがレンダリングされる前にサービスをロードする必要があることです。 http://jsfiddle.net/g75XQ/2/

HTML:

<div ng-app="app" ng-controller="root">
    <h3>Do not render this before user has loaded</h3>            
    {{user}}
</div>
​

JavaScript:

angular.module('app', []).
factory('user',function($timeout,$q){
    var user = {};            
    $timeout(function(){//Simulate a request
        user.name = "Jossi";
    },1000);
    return user;
}).
controller('root',function($scope,user){

    alert("Do not alert before user has loaded");
    $scope.user = user;

});
​

</p>

4

6 に答える 6

14

属性を使用した自動初期化の代わりに、手動初期化を使用して角度アプリの初期化を延期できng-appます。

// define some service that has `$window` injected and read your data from it
angular.service('myService', ['$window', ($window) =>({   
      getData() {
          return $window.myData;
      }
}))    

const callService = (cb) => {
   $.ajax(...).success((data)=>{
         window.myData = data;
         cb(data)
   })
}

// init angular app 
angular.element(document).ready(function() {
       callService(function (data) {
          doSomething(data);
          angular.bootstrap(document);
       });
});

callServiceAJAX呼び出しを実行し、Angularアプリを初期化する成功コールバックを受け入れる関数はどこにありますか。

ngCloakディレクティブもチェックしてください。必要なものがすべて揃っている可能性があります。

または、ngRouteを使用する場合は、プロパティを使用できますresolve。そのため、@honkskilletの回答を確認できます。

于 2012-09-30T00:28:28.180 に答える
9

手動でブートストラップするよりもさらに優れています (これも常に悪い考えではありません)。

angular.module('myApp', ['app.services'])
   .run(function(myservice) {
      //stuff here.
   });
于 2013-03-04T18:29:06.400 に答える
4

コメントで述べたように、コントローラーでアンロード状態を処理する方がはるかに簡単です。$ qの恩恵を受けて、これを非常に簡単にすることができます:http: //jsfiddle.net/g/g75XQ/4/

ユーザーがロードされたときにコントローラーで何かを作成したい場合:http://jsfiddle.net/g/g75XQ/6/

編集:一部のデータが読み込まれるまでルート変更を遅らせるには、次の回答をご覧ください:ちらつきを防ぐためにモデルが読み込まれるまでAngularJSルート変更を遅らせる

于 2012-09-30T16:15:40.897 に答える
4

これを実現する正しい方法は、ルート定義で resolve プロパティを使用することです: http://docs.angularjs.org/api/ngRoute.$routeProviderを参照してください。

次に、$q サービスを使用して promise を作成して返します。また、$http を使用してリクエストを行い、応答時に promise を解決します。

そうすれば、ルートが解決されてコントローラーがロードされると、promise の結果が既に利用可能になり、ちらつきは発生しません。

于 2013-09-09T14:57:49.377 に答える
0

いくつかの方法があり、他の方法よりも高度なものもありますが、あなたの場合は ng-hide がうまくいきます。http://jsfiddle.net/roytruelove/g75XQ/3/を参照してください

于 2012-09-29T23:54:55.310 に答える