3

「サブ」状態のデータが必要で、それを取得しようとして髪を引っ張っています。問題は、毎回 $rootScope からデータを取得することです。

だからここに行く - 私の問題の概要。

私は状態プロバイダーを使用しています。だからここに私の最初の状態があります:

    .state('dashboard.create', {
        // parent: 'dashboard',
        url: '/create',
        views: {
          '': {
            templateUrl: "/app/partials/create.html",
            controller: "CreateCtrl",
          }
        }
      })

CreateCtrl では、これを呼び出すだけですdashboardAPI.lessons();

services.factory('dashboardAPI', ['$rootScope', '$q', '$http', function(rootScope, $q, $http) {

  function load(path) {
    return $http.get("/app/data" + path);
  }

  return {
    lessons: function() {
      var deferred = $q.defer();

      if (rootScope.lessons == undefined) {
        load("/getLessons.json").success(function (data) {
          rootScope.lessons = data.result;
          deferred.resolve(data.result);
        }).
        error( function() {
          console.log("Problem getting lessons");
        });
      }
      else
        deferred.resolve(rootScope.lessons);
      return deferred.promise;
    }
  };

}]);

これは rootScope.lessons オブジェクトを埋めるために機能するため、ビューにデータを入力できます。

次に、次のようなサブ状態があります。

    .state('dashboard.create.lessons', {
        // parent: 'create',
        url: '/lessons',
        views: {
          'curriculum': {
            templateUrl: "/app/partials/create.lessons.html",
            controller: ['curriculumHash', function(curriculumHash){
              curriculumHash.sstHash();
            }],
          },
        }
      })

このコントローラーでは、別のサービスを呼び出しています。

services.factory('curriculumHash', ['$rootScope', '$q', 'dashboardAPI', function(rootScope, $q, dashboardAPI) {

  return {
    sstHash: function() {
      var deferred = $q.defer();

      if (rootScope.sstopicsArray == undefined) {
        //Get a promise back from API call
        dashboardAPI.lessons().then(function(data) {
          rootScope.sstopicsArray = [];
          var x = data.Topics;
          for (var i=0; i<x.length; i++) {
            var y = x[i].Subtopics;
            for (var j=0; j<y.length; j++) {
              var z = y[j].Subsubtopics;
              for (var k=0; k<z.length; k++) {
                rootScope.sstopicsArray.push({
                  Id: z[k].Id,
                  Name: z[k].Name,
                  Description: z[k].Description,
                  List: z[k].Lessons
                });
              }
            }
          }
          return deferred.resolve();
        });
      }
      else
        return deferred.resolve();
    }
  };
}]);

そして、これも機能します。配列を埋めるときに、それを使用してビューに並べ替え可能なjqueryリストを入力できます。言い換えれば、非常に長いオブジェクト (上からの教訓) を取り、それをより単純なハッシュ配列に分割する必要があります。

ここで、コンピューターを窓の外に放り出したいところです。

その新しいハッシュで 1 つのオブジェクトを見つけることができるサブ (サブ) ステートがもう 1 つ必要です。

     .state('dashboard.create.lessons.detail', {
        // parent: 'lessons',
        url: '/{lessonId}',
        views: {
          'detail@dashboard.create': {
            templateUrl: "/app/partials/create.detail.html",
            resolve: {
              getData: "curriculumHash"
            },
            controller: ['$scope', '$stateParams', 'getData', function(scope, stateParams, getData){
                getData.sstHash().then(function() {

                  for (var i=0; i<scope.sstopicsArray.length; i++) {
                    var b = a[i];
                    for (var j=0; j<b.length; j++) {
                      if (b[j].Id == stateParams.lessonId)
                        scope.activeItem = b[j];
                    };
                  }
                });
              })
            }],
          }
        }
      })

私は解決の使用方法の適切な例を高低で検索しました。関係なく、dashboard.create.lessons.detail 状態のコントローラーにストップ ブレークを配置すると、getData が未定義であると表示され、未定義のオブジェクトの長さを取得できないため、chrome がエラーをスローします。

誰でもヒントを提案できますか。モデルで遊んでみたいので、スコープに入れる必要があります。angular uiサイトよりも詳細な解決ドキュメントを誰かに紹介してもらえれば、役立つかもしれません。ありがとう!

4

1 に答える 1

3

私が最終的にやったのは、カリキュラムハッシュサービスでプロミスを返すことでした。次に、promise が解決されるまでコントローラーが起動しないように、appStates.js に解決を入れます。

そのようです:

.state('dashboard.create', {
    // parent: 'dashboard',
    url: '/create',
    views: {
      '': {
        templateUrl: "/app/partials/create.html",
        resolve:{
          'curriculumHashPromise':function(curriculumHash){
            return curriculumHash.promise;
          }
        },
        controller: ['$rootScope', function(rootScope){
          //I will have access to all curriculumHash methods as well as dashBoard 
        }],
      }
    },

ここでこの質問を参照して、答えを見つけました。詳細が必要な場合はお知らせください。ただし、リファレンスは非常に役立ちます。

于 2013-07-26T14:36:53.243 に答える