2017-02-24 25 views
1

我有要求這裏看到了一些數據之前執行的路線解決的途徑提供:

$routeProvider.when("/", { 
    template: '<home message="$resolve.getMessage"></home>', 
    resolve: { 
     getMessage: getMessage 
    } 
}) 

數據,然後傳遞給我的家庭成分是由允許從控制器訪問它綁定,在這裏看到:

.component('home', { 
    templateUrl: '/app/content/home.component.html', 
    bindings: { 
     message: '=' 
    }, 
    controller: 'HomeController' 
}); 

當從消息試圖直接訪問數據時,控制器的負載(這是我的印象是,控制器沒有按」執行它的代碼直到routeProvider中的解析函數解析...)我想出了一個未定義的變量。

function HomeController() { 
    var vm = this; 
    console.log(vm.message); //undefined 
    setTimeout(function() { 
     console.log(vm.message); //properly defined 
    }, 1000); 
} 

超時函數中的代碼正確執行數據。我再次受到這樣的印象:在收到解決承諾的數據之前,Controller代碼才被調用/執行。我覺得我必須用這個邏輯來犯錯誤。

任何人都可以提供有關數據爲什麼延遲到組件控制器的信息,即使使用解決方案嗎?

謝謝!

+0

如果你仍然需要將它注入控制器,那麼綁定點又是什麼? –

+0

您正在使用哪種角度的版本? –

回答

1

我假設你使用的是角度爲1.6的版本,其中的綁定變得未定義。

您必須使用$onInit方法來訪問綁定。

function HomeController() { 
    var vm = this; 
    console.log(vm.message); //undefined 
    vm.$onInit = function(){ 
    // Angular 1.6 onwards, bindings will only be accessible in $onInit method 
    console.log(vm.message); // binding value after resolve 
    }; 
} 

https://docs.angularjs.org/guide/component

$的OnInit() - 預&交聯功能之前已經被構造之後所有的 元件上的控制器,並其綁定初始化(和 調用每個控制器上對於這個 元素的指令)。這是爲您的 控制器設置初始化代碼的好地方。

+0

這是完美的,這就是我一直在尋找的東西。非常感謝。按預期工作。 vm。$ onInit = function(){console.log(vm.message)} –

2

因爲您致電$resolve。你不應該在你的html中調用它。

定義這是使用服務與解決控制器:

$routeProvider.when("/", { 
    template: '<home message="homeMessage"></home>', 
    controller : 'MyRouteController', 
    resolve: { 
     message : getMessage 
     //getMessage can be async 
    } 
}) 


app.controller("MyRouteController", function ($scope, message) { 
    $scope.homeMessage = message; 
}); 

現在你可以把它送到你的組件。

信息

我建議這種情況下使用templateUrl。

如果您的路線是「/家」然後將其命名,如:

controller : HomeController 
templateUrl : 'home.html' 

如果您想使用組件顯示回家的消息然後將其命名,如:

component : home-message.component.js 
controller : HomeMessageController 
templateUrl : 'home-message.html' 

不要忘記:路由控制器和組件控制器是不同的!

+0

我實現了這個解決方案,但HomeController在最初運行時仍然無法訪問。看起來我正在尋找的是如何讓組件控制器不會執行直到路由解析完成。 + 1ing,因爲它顯示了一個可立即訪問解析數據的控制器。 –

+0

@BrentAureli如果你正在使用解決方案;控制器必須等待消息數據。你能顯示你的getMessage函數嗎? – hurricane

+0

@BrentAureli並且不要在你的綁定中使用通用名稱。改變「消息」綁定到'myMessage'和我們在HTML我的消息 – hurricane

相關問題