首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用户界面在成功后不会用数据更新。

用户界面在成功后不会用数据更新。
EN

Stack Overflow用户
提问于 2013-10-12 16:13:45
回答 1查看 255关注 0票数 0

我是新来的微风,我正在创造一个样本来学习。我正面临一个问题。我创建了一个datacontext.js,在其中我添加了轻松代码,以便从服务中获取数据,如下所示

代码语言:javascript
运行
复制
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。这是我的控制器

代码语言:javascript
运行
复制
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) {

};
}]);

现在的问题是,它显示在完成请求后,我的数组中有两条记录(显示在控制台中),但是如果我使用

代码语言:javascript
运行
复制
<span>{{Products.length}}</span>

但是如果我在请求完成后调用$scope.$apply(),那么它的工作就很好。

您能告诉我代码中的错误是什么吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 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调用:

代码语言:javascript
运行
复制
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变量的引用。当你用

代码语言:javascript
运行
复制
$scope.Products = []

您创建一个数组A并使产品引用该数组。然后,在回调中更改产品引用的数组。

代码语言:javascript
运行
复制
$scope.Products = data.results;

尝试遍历data.results数组并将其推送到Products数组,看看这是否有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19336424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档