2016-06-12 55 views
0
function ExampleCtrl(HttpGet){ 
    'ngInject'; 

    const vm = this; 
    vm.title = 'test'; 


    HttpGet.get().then(function(response){ 
    console.log(vm.title); //logs 'test'; 
    vm.response = response.data; 
    console.log(vm.response); //logs the response; 

    }); 

} 

export default { 
    name : 'ExampleCrl', 
    fn : ExampleCtrl 
}; 

筆者認爲:爲什麼vm不能綁定到這個?

{{ home.response }} 

UI路由器:

$stateProvider 
    .state('Home', { 
    url : '/home/:page', 
    controller : 'ExampleCtrl as home', 
    templateUrl: 'home.html', 
    title : 'Home' 
    }); 

HttpGet服務:

function HttpGet($http) { 
    'ngInject'; 

    const service = {}; 

    service.get = function() { 
    return new Promise(function(resolve, reject) { 
     $http.get('http://localhost:8000/all').success((data) => { 
     resolve(data); 
     }).error((err, status) => { 
     reject(err, status); 
     }); 
    }); 
    }; 

    return service; 

} 

export default { 
    name: 'HttpGet', 
    fn: HttpGet 
}; 

是不是做vm=this的整點是一個功能塊內this還在嗎?

+0

嘗試使用'let'而不是'const'。提供顯示問題 – charlietfl

+0

的[mcve]。仍然不起作用。更新我的問題 –

+0

仍然太多未知數。還沒有澄清,如果請求是在表面上 – charlietfl

回答

2

您的問題沒有約束力this。它工作正常。

你的問題是你離開角度的digest週期,所以你的HTML視圖不更新。

service.get = function() { 
    return new Promise(function(resolve, reject) { 
     $http.get('http://localhost:8000/all').success((data) => { 
     resolve(data); 
     }).error((err, status) => { 
     reject(err, status); 
     }); 
    }); 
    }; 

在這裏你創建新的承諾,並稱之爲resolve函數。但它是本地ES6的承諾。當它調用then處理程序時,它已經超出了角度摘要循環。

所以,你應該叫ditest使用

 $http.get('http://localhost:8000/all').success((data) => { 
     $scope.$apply(() => resolve(data)); 
     }).error((err, status) => { 

手動但是因爲$http.get已經返回一個承諾就可以解決這個就更簡單了。只要這樣做:

service.get = function() { 
    return $http.get('http://localhost:8000/all'); 
    }; 

而就是這樣。 $http.get已經爲你調用摘要。

如果您真的需要在您的角碼中創建一個承諾,那麼請使用angular的$q服務而不是ES6承諾,因爲它已經將消化週期考慮在內。

相關問題