我是新来的微风,我正在创造一个样本来学习。我正面临一个问题。我创建了一个datacontext.js,在其中我添加了轻松代码,以便从服务中获取数据,如下所示
sample.factory('datacontext', ['breeze', 'Q', '$timeout', '$q', function (breeze, q, timeout, $q) {
configureBreeze();
var manager = new breeze.EntityManager("/breeze/ProductsBreeze");
manager.enableSaveQueuing(true);
var datacontext = {
metadataStore: manager.metadataStore,
getTodoLists: getTodoLists
};
function getTodoLists(onsuccess) {
var query = breeze.EntityQuery.from("GetAllProducts");
manager.executeQuery(query).then(onsuccess);
};
return datacontext;
//function getSucceeded(data) {
// return data.results;
//}
function configureBreeze() {
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
// configure to use camelCase
breeze.NamingConvention.camelCase.setAsDefault();
}
}]);
现在在getTodoLists中,我正在传递一个回调onsuccess。这是我的控制器
sample.controller('todoBreeze', ['datacontext', '$scope', '$log', function (datacontext, $scope, log) {
$scope.heading = "Hello World";
$scope.Products = [];
datacontext.getTodoLists(function (data) {
$scope.Products = data.results;
log.info($scope.Products);
});
$scope.editProduct = function (pid, index) {
};
$scope.deleteProduct = function (pid, index) {
};
}]);
现在的问题是,它显示在完成请求后,我的数组中有两条记录(显示在控制台中),但是如果我使用
<span>{{Products.length}}</span>
但是如果我在请求完成后调用$scope.$apply()
,那么它的工作就很好。
您能告诉我代码中的错误是什么吗?
谢谢
发布于 2013-10-12 16:54:07
参见下面的更新.
$scope.$apply()函数用于将代码放回"AngularJS世界“。
当像您正在做的那样使用第三方库时,这正是在AngularJS摘要循环中执行代码所需要的。当使用具有回调的AngularJS服务时,它们已经在后台调用了$apply(),并将代码放回AngularJS摘要周期。
在您的示例中,您创建了自己的服务,并在控制器中传递一个回调。当调用该回调时,您已经超出了AngularJS摘要周期,因此AngularJS不会注意到范围发生了变化。调用$apply函数将代码设置为AngularJS摘要周期,让我们AngularJS看到作用域发生了变化。
关于$scope.$apply的更详细的指南可以在http://jimhoskins.com/2012/12/17/angularjs-and-apply.html上找到
因此,您可以像这样修改工厂代码,以包含$apply调用:
sample.factory('datacontext', ['breeze', 'Q', '$timeout', '$q', '$rootScope', function (breeze, q, timeout, $q, $scope) {
configureBreeze();
var manager = new breeze.EntityManager("/breeze/ProductsBreeze");
manager.enableSaveQueuing(true);
var datacontext = {
metadataStore: manager.metadataStore,
getTodoLists: getTodoLists
};
function getTodoLists(onsuccess) {
var query = breeze.EntityQuery.from("GetAllProducts");
manager.executeQuery(query).then($rootScope.$apply(onsuccess));
};
return datacontext;
这样,您就不需要在每个使用您的服务的控制器上调用它。
更新:
你对$scope.$apply()的判决误导了我。这就是为什么最好是提供一个工作的例子,所以我们可以玩它。
我认为问题在于您正在更改设置$scope.Products变量的引用。当你用
$scope.Products = []
您创建一个数组A并使产品引用该数组。然后,在回调中更改产品引用的数组。
$scope.Products = data.results;
尝试遍历data.results数组并将其推送到Products数组,看看这是否有帮助。
https://stackoverflow.com/questions/19336424
复制相似问题