使用 jq-plot 在 AngularJS 视图中异步加载 views/handling 承诺
Asynchronous loading of views/handling promises in AngularJS views with jq-plot
我有一个用于 jq-plot 的控制器,如下所示:
app.controller('chartCtrl', ['$scope', 'Model1', 'Model2', function($scope, Model1, Model2) {
var model1 = new Model1();
model1.firstAsyncMethod(function() {
var model2 = new Model2();
model2.secondAsyncMethod(function() {
$scope.data = [ [1,6.5],[2,6.5],[3,7],[4,8],[5,7.5],[6,7],[7,6.8],[8,7],[9,7.2],[10,7],[11,6.8],[12,7] ];
})
});
}]);
如您所见,我首先调用 firstAsyncMethod()
并将回调传递给它。此回调对 secondAsyncMethod()
进行另一个异步调用。只有在这个 secondAsyncMethod()
解决后我的 $scope.data
才可用。
同时,我对该控制器的看法如下:
<div ng-controller="chartCtrl">
<div ui-jq="plot" ui-options="
[
{ data: {{data}}}
]
">
</div>
</div>
现在,问题是当 ui-options
尝试在页面加载时加载 data
时,控制器尚未返回 data
。这会在 angularJS.
中抛出解析错误
在第二个异步方法完全解决后,我尝试在控制器中定义图表选项,但我仍然不断收到错误。我该如何解决这个问题?谢谢。
您可以使用 resolve, this will make (usually asynchronously fetched) data available in your controller when it loads. It's available both in ngRoute
and ui-router
, you'll also have to wrap these callbacks in a promise using $q。
将此添加到 chartCtrl
的路由定义中:
resolve: {
modelData: function($q, Model1, Model2) {
//use $q to wrap asynchronous callbacks in promises
var deferred = $q.defer();
var model1 = new Model1();
model1.firstAsyncMethod(function() {
var model2 = new Model2();
model2.secondAsyncMethod(function() {
var data = [ [1,6.5],[2,6.5],[3,7],[4,8],[5,7.5],[6,7],[7,6.8],[8,7],[9,7.2],[10,7],[11,6.8],[12,7] ];
deferred.resolve(data);
});
});
return deferred.promise;
}
}
然后您可以在您的控制器中注入 modelData
:
app.controller('chartCtrl', ['$scope', 'modelData', function($scope, modelData) {
$scope.data = modelData;
}]);
好吧,我终于设法找到了一个更简单的解决方案。您需要做的就是向视图添加 ui-refresh
指令:
<div ng-controller="chartCtrl">
<div ui-jq="plot" ui-refresh="data" ui-options="
[
{ data: {{data}}}
]
">
</div>
在控制器中,您必须将 data
定义为异步调用之外的某个默认值以停止抛出错误:
app.controller('chartCtrl', ['$scope', 'Model1', 'Model2', function($scope, Model1, Model2) {
$scope.data = [[0,0]];
var model1 = new Model1();
model1.firstAsyncMethod(function() {
var model2 = new Model2();
model2.secondAsyncMethod(function() {
$scope.data = [ [1,6.5],[2,6.5],[3,7],[4,8],[5,7.5],[6,7],[7,6.8],[8,7],[9,7.2],[10,7],[11,6.8],[12,7] ];
})
});
}]);
我有一个用于 jq-plot 的控制器,如下所示:
app.controller('chartCtrl', ['$scope', 'Model1', 'Model2', function($scope, Model1, Model2) {
var model1 = new Model1();
model1.firstAsyncMethod(function() {
var model2 = new Model2();
model2.secondAsyncMethod(function() {
$scope.data = [ [1,6.5],[2,6.5],[3,7],[4,8],[5,7.5],[6,7],[7,6.8],[8,7],[9,7.2],[10,7],[11,6.8],[12,7] ];
})
});
}]);
如您所见,我首先调用 firstAsyncMethod()
并将回调传递给它。此回调对 secondAsyncMethod()
进行另一个异步调用。只有在这个 secondAsyncMethod()
解决后我的 $scope.data
才可用。
同时,我对该控制器的看法如下:
<div ng-controller="chartCtrl">
<div ui-jq="plot" ui-options="
[
{ data: {{data}}}
]
">
</div>
</div>
现在,问题是当 ui-options
尝试在页面加载时加载 data
时,控制器尚未返回 data
。这会在 angularJS.
在第二个异步方法完全解决后,我尝试在控制器中定义图表选项,但我仍然不断收到错误。我该如何解决这个问题?谢谢。
您可以使用 resolve, this will make (usually asynchronously fetched) data available in your controller when it loads. It's available both in ngRoute
and ui-router
, you'll also have to wrap these callbacks in a promise using $q。
将此添加到 chartCtrl
的路由定义中:
resolve: {
modelData: function($q, Model1, Model2) {
//use $q to wrap asynchronous callbacks in promises
var deferred = $q.defer();
var model1 = new Model1();
model1.firstAsyncMethod(function() {
var model2 = new Model2();
model2.secondAsyncMethod(function() {
var data = [ [1,6.5],[2,6.5],[3,7],[4,8],[5,7.5],[6,7],[7,6.8],[8,7],[9,7.2],[10,7],[11,6.8],[12,7] ];
deferred.resolve(data);
});
});
return deferred.promise;
}
}
然后您可以在您的控制器中注入 modelData
:
app.controller('chartCtrl', ['$scope', 'modelData', function($scope, modelData) {
$scope.data = modelData;
}]);
好吧,我终于设法找到了一个更简单的解决方案。您需要做的就是向视图添加 ui-refresh
指令:
<div ng-controller="chartCtrl">
<div ui-jq="plot" ui-refresh="data" ui-options="
[
{ data: {{data}}}
]
">
</div>
在控制器中,您必须将 data
定义为异步调用之外的某个默认值以停止抛出错误:
app.controller('chartCtrl', ['$scope', 'Model1', 'Model2', function($scope, Model1, Model2) {
$scope.data = [[0,0]];
var model1 = new Model1();
model1.firstAsyncMethod(function() {
var model2 = new Model2();
model2.secondAsyncMethod(function() {
$scope.data = [ [1,6.5],[2,6.5],[3,7],[4,8],[5,7.5],[6,7],[7,6.8],[8,7],[9,7.2],[10,7],[11,6.8],[12,7] ];
})
});
}]);