2015-06-22 120 views
0

我繼續發現偉大的ui路由器。我現在關注resolve()的功能。我有一個基地$state我從後端解析查詢()。控制器訪問ui路由器解析

$stateProvider 
    .state('baseApp', { 
     url: '/app', 
     abstract: false, 
     templateUrl: 'app/layout/baseApp.html', 
     authenticate: true, 
     resolve: { 
     // Access API Service 
     APIService: 'APIService', 

     // Operators 
     myObjects: function(APIService){ 
      // APIService is a service exposing $resource 
      return APIService.myObjects.query().$promise; 
     } 
     } 
    }) 
    .state('baseApp.state1', { 
     url: '/state1', 
     views: { 
     'workspace': { 
      templateUrl: 'app/state1.html', 
      controller: 'State1Ctrl', 
      controllerAs: 'state1' 
     } 
     }, 
     authenticate: true 
    }) 

我試圖訪問myObjects在我State1Ctrl

function State1Ctrl(myObjects) { 
    .... 
    console.log(myObjects); 
    .... 
} 

我希望看到myMobject列表打印在控制檯中。可悲的是,這裏是輸出:

undefined 

看來我無法訪問我的控制器中的承諾。你知道爲什麼嗎?

+0

這段代碼對我來說很合適。你能把這個最小的例子放在一個plunkr中嗎?附註:APIService:'APIService'是不必要的... –

回答

0

您應該在$resource承諾函函數中獲取數據。

function State1Ctrl(myObjects) { 
    .... 
    cmyObjects.then(function(data){ 
     console.log(data) 
    }); 
} 
0

這個問題其實很簡單:

UI路由器注射決心值相關聯的狀態控制器。

要讓它進入你的控制器,你應該你的決心移動到子狀態

$stateProvider 
.state('baseApp', { 
    url: '/app', 
    abstract: false, 
    templateUrl: 'app/layout/baseApp.html', 
    authenticate: true 
}) 
.state('baseApp.state1', { 
    url: '/state1', 
    views: { 
    'workspace': { 
    resolve: { 
     // Access API Service 
     APIService: 'APIService', 

     // Operators 
     myObjects: function(APIService){ 
      // APIService is a service exposing $resource 
      return APIService.myObjects.query().$promise; 
     }  
     } 
     templateUrl: 'app/state1.html', 
     controller: 'State1Ctrl', 
     controllerAs: 'state1' 
    } 
    }, 
    authenticate: true 
}) 

編輯:在您的特定情況下,我覺得你想要的是有一個「父」控制器到您的第一個狀態是這樣的:

$stateProvider 
.state('baseApp', { 
    url: '/app', 
    abstract: false, 
    templateUrl: 'app/layout/baseApp.html', 
    authenticate: true, 
    controller: BaseAppCtrl, 
    resolve: { 
    // Access API Service 
    APIService: 'APIService', 

    // Operators 
    myObjects: function(APIService){ 
     // APIService is a service exposing $resource 
     return APIService.myObjects.query().$promise; 
    } 
    } 
}) 
.state('baseApp.state1', { 
    url: '/state1', 
    views: { 
    'workspace': { 
     templateUrl: 'app/state1.html', 
     controller: 'State1Ctrl', 
     controllerAs: 'state1' 
    } 
    }, 
    authenticate: true 
}) 

你只需要將這些參數注入父控制器。您可以訪問您的子$範圍內的父$範圍。

在父控制器:

function BaseAppCtrl($scope, myObjects) { 
    .... 
    $scope.myObjects = myObjects; 
    console.log(myObjects); 
    .... 
} 

function State1Ctrl($scope) { 
    .... 
    console.log($scope.myObjects); 
    .... 
} 

兩者的console.log應該顯示在這種情況下的值。

你可以看到它的工作對this plunker

希望它幫助。

+0

我試圖添加父控制器並訪問已解析的myObjects,但我仍然有未定義的結果。 –

+0

要做一名笨蛋來驗證我的猜測。我會分享它 – Okazari

+0

謝謝。我試圖將這種方法應用於全球範圍內的資源訪問http://www.jvandemo.com/how-to-resolve-application-wide-resources-centrally-in-angularjs-with-ui-router/。 –