我在Hawtio环境中有一个应用程序作为插件。要求是使用Jolokia请求,而不是使用直接$http
服务调用。
所以我的工厂/服务有一个检索功能。
app.factory('myService', function($q, jolokia) {
data: {
list: []
},
retrieve: function() {
var self = this;
// var deferred = $q.deferred();
jolokia.request({
type: 'exec',
mbean: mybean.mbean,
operation: 'ops',
arguments: [...]
}, {
method: 'POST',
success: function(response) {
var temp = [];
/* assign values to temp from response */
self.assignValuesToList(temp);
/* log shows data.list is loaded by values */
log("[service] " + self.data.list); // Hawtio uses a different logger
// deferred.resolve();
}
}, {
error: function(error) {
// error handling here
// deferred.reject(error);
}
});
// return deferred.promise;
}
});
这是我的控制器(该服务正在被其他控制器重用,这就是为什么我必须重新分配myService.data.list
事件myController
的范围app.controller('myController', function($scope, myService) {
$scope.ctrl.copyOfList = [];
angular.extend($scope, myService);
$scope.init = function() {
$scope.search();
log("[after search] " + $scope.ctrl.copyOfList);
};
$scope.search = function {
$scope.retrieve();
$scope.ctrl.copyOfList = $scope.data.list;
$scope.$apply();
log("[search] " + $scope.ctrl.copyOfList);
};
});
的范围已经有控制权在它上面):
<div ng-controller='myController' ng-init='init()'>
<table>
<thead>...</thead>
<tbody>
<tr ng-repeat='entry in ctrl.copyOfList'>
...
</tr>
</table>
</div>
和html:
[search] [] // empty
[after search] [] // empty
[service] [...] // service.data.list has values fetched by jolokia request from server
这是我的日志序列:
app.controller('myController', function($scope, myService) {
$scope.ctrl.copyOfList = [];
angular.extend($scope, myService);
$scope.init = function() {
$scope.search();
log("[after search] " + $scope.ctrl.copyOfList);
};
$scope.search = function {
$scope.retrieve().
then(function() {
$scope.ctrl.copyOfList = $scope.data.list;
log("[controller] " + $scope.ctrl.copyOfList);
$scope.$apply();
}, function(error) {
// error handling here
});
log("[after promise] " + $scope.ctrl.copyOfList);
};
});
,表格为空。
由于手头有异步问题,我尝试使用promise(只是取消注释上面服务的延迟行)。我的控制器变为
[after promise] []
[after search] []
[service] [...]
// [controller] [...] log does not execute
现在我的日志看起来像:
myController
并且表格仍为空。这里更令人困惑的是,在我离开使用[controller][...]
的页面之前,$scope.ctrl.copyOfList
日志将在控制台上打印并写入deferred.resolve(self.data.list)
的内容并立即填充表格然后突然改变页面。
(我也尝试使用deferred.resolve()
代替{{1}},包括对控制器进行必要的更改,但这并不重要,但结果相同。
所以任何人都可以在这里找出发生了什么,以及可能的解决方案是什么? 感谢。
答案 0 :(得分:1)
在jolokia成功/错误回调中,你需要一个$ scope。$ apply()来触发角度事件循环。在像这样的服务中,我通常会注入$ rootScope并使用Core。$ apply($ rootScope)