angularjs - 为什么这里需要 Angular $apply ?

标签 angularjs data-binding breeze

请考虑以下 Controller 的 angularjs 代码:

(function (app) {
    var controller = function ($scope, $state, datacontext) {
        $scope.$parent.manageTitle = "Account Management";
        $scope.accounts = [];

        var init = function () {
            getRecords();
        };

        var getRecords = function () {
            return datacontext.getAccounts().then(function (data) {
                $scope.$apply(function () {
                    $scope.accounts = data;
                });
            });
        };

        init();
    };

    app.controller("accountsCtrl", ["$scope", "$state", "datacontext", controller]);
})(angular.module("app"));

删除 $scope.$apply 包装器并仅保留 getRecords 方法中的“$scope.accounts = data”会破坏代码。数据已检索,但 html 中的 ng-repeat 指令不会自动更新。我试图了解整个 $apply/$digest 模型,但在这种情况下似乎不需要 $apply 。

我做错了什么吗?

谢谢。

<------------------------------------------ 编辑 --- -------------------------------------------------->

好的,谢谢您的回复。这是数据上下文。它使用 Breeze 。我仍然不明白问题出在哪里 - - 我只是不明白为什么上面的代码中需要 $apply。

(function (app) {
    var datacontext = function () {
        'use strict';
        breeze.config.initializeAdapterInstance('modelLibrary', 'backingStore', true);
        breeze.config.initializeAdapterInstance("ajax", "angular", true);
        breeze.NamingConvention.camelCase.setAsDefault();

        var service;
        var manager = new breeze.EntityManager('api/ProximityApi');
        var entityQuery = breeze.EntityQuery;

        var queryFailed = function (error) {
        };

        var querySuccess = function (data) {
            return data.results;
        };

        var getAccounts = function () {
            var orderBy = 'accountName';
            return entityQuery.from('Accounts')
                .select('id, accountName')
                .orderBy(orderBy)
                .using(manager)
                .execute()
                .then(querySuccess, queryFailed);
        };

        service = {
            getAccounts: getAccounts
        };

        return service;
    };
    app.factory('datacontext', [datacontext]);
})(angular.module('app'));

再次感谢!

最佳答案

感谢您的回答。贾里德——你的钱是对的。默认情况下,Breeze 不使用 Angular $q Promise,而是使用第三方 Q.js Promise。因此,我需要 $apply 将虚拟机同步到 View 。然而最近,Breeze 人员创建了 angular.breeze.js,它允许 Breeze 代码使用 Angular Promise。通过在应用程序中包含 angular.breeze 模块,所有 Breeze 代码都将使用 native Angular Promise 和 $http。

这解决了我的问题,我可以删除 $apply 调用。

参见:http://www.breezejs.com/documentation/breeze-angular-service

关于angularjs - 为什么这里需要 Angular $apply ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23569128/

相关文章:

javascript - 保持 md-select 打开直到在外部单击 - AngularJS

javascript - 在 Angularjs 中记住我的功能和 token

Android 数据绑定(bind)不适用于 <merge> 属性

android - 设置安卓 :textAppearance with DataBinding

c# - 从Breeze Web API返回警告而不是错误

javascript - 我如何使用 javascript 在 angularjs 中进行 session 处理?

javascript - jquery 扩展与 Angular 扩展

c# - 绑定(bind)数据更改时 Winforms 列表框不更新

angularjs - 使用 $route resolve stops 页面解决 breeze query/Q promise