Angularjs 为什么这里需要申请? 请考虑以下控制器的角度JS代码: (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"));

Angularjs 为什么这里需要申请? 请考虑以下控制器的角度JS代码: (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"));,angularjs,data-binding,breeze,Angularjs,Data Binding,Breeze,删除$scope.$apply包装并在getRecords方法中只保留“$scope.accounts=data”会破坏代码。将检索数据,但不会自动更新html中的ng repeat指令。我试图让我的手臂围绕着整个$apply/$digest模型,但在这种情况下似乎不需要$apply 我做错什么了吗 谢谢 好的,谢谢你的回复。下面是数据上下文。它利用微风。我仍然不明白问题是什么——我只是不明白为什么上面的代码中需要$apply (function (app) { var datacon

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

我做错什么了吗

谢谢

好的,谢谢你的回复。下面是数据上下文。它利用微风。我仍然不明白问题是什么——我只是不明白为什么上面的代码中需要$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'));

再次感谢

需要使用$apply函数的原因是使用Breeze返回数据的结果。$apply函数用于获取角度,以便在所有内部手表上运行摘要,并相应地更新范围。当所有更改都发生在角度范围内时,不需要这样做,因为它会自动进行此摘要。在您的代码中,因为您使用的是Breeze,所以更改发生在angular范围之外,因此您需要使用angular来手动运行摘要,这对于angular之外发生的任何事情都是正确的(jQuery、其他框架等等)。Breeze确实在使用承诺更新数据,但是Angular不知道在承诺返回后如何处理更改,因为它超出了范围。如果您使用带有承诺的角度服务,则视图将自动更新。如果您的代码工作正常,那么以这种方式使用$apply将是正确的方法

我唯一的建议是更改调用apply的方式,以确保它仅在当前未进行另一个摘要时运行,因为这可能会导致摘要错误。我建议您这样调用函数:

if(!$scope.$$phase){$scope.$apply(function () {
   $scope.accounts = data;
});

或者,另一个选项是围绕$apply函数编写一个自定义包装,如下所示。

您需要使用$apply函数的原因是使用Breeze返回数据的结果。$apply函数用于获取角度,以便在所有内部手表上运行摘要,并相应地更新范围。当所有更改都发生在角度范围内时,不需要这样做,因为它会自动进行此摘要。在您的代码中,因为您使用的是Breeze,所以更改发生在angular范围之外,因此您需要使用angular来手动运行摘要,这对于angular之外发生的任何事情都是正确的(jQuery、其他框架等等)。Breeze确实在使用承诺更新数据,但是Angular不知道在承诺返回后如何处理更改,因为它超出了范围。如果您使用带有承诺的角度服务,则视图将自动更新。如果您的代码工作正常,那么以这种方式使用$apply将是正确的方法

我唯一的建议是更改调用apply的方式,以确保它仅在当前未进行另一个摘要时运行,因为这可能会导致摘要错误。我建议您这样调用函数:

if(!$scope.$$phase){$scope.$apply(function () {
   $scope.accounts = data;
});

或者另一个选项是围绕$apply函数编写一个自定义包装,如下所示

谢谢您的回答。杰瑞德-你在钱的问题上是对的。默认情况下,Breeze不使用angular$q承诺,而是使用第三方q.js承诺。因此,我需要$apply将VM与视图同步。然而,最近Breeze的人创建了angular.Breeze.js,它允许Breeze代码使用angular承诺。通过在应用程序中包含angular.breeze模块,所有breeze代码都将使用本机angular承诺和$http

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


请参阅:

谢谢您的回答。杰瑞德-你在钱的问题上是对的。默认情况下,Breeze不使用angular$q承诺,而是使用第三方q.js承诺。因此,我需要$apply将VM与视图同步。然而,最近Breeze的人创建了angular.Breeze.js,它允许Breeze代码使用angular承诺。通过在应用程序中包含angular.breeze模块,所有breeze代码都将使用本机angular承诺和$http

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


请参阅:

这完全取决于
getAccounts()
方法返回的内容……datacontext是服务吗?该服务是否使用承诺?datacontext是服务,您可以在控制器初始化的数组符号中看到它。它是否设置为使用承诺?他/她不知道(他/她不是OP):)这一切都取决于
getAccounts()
方法返回的内容…datacontext是服务吗?该服务是否使用承诺?datacontext是服务,您可以在控制器初始化的数组表示法中看到它。它是否设置为使用承诺?他/她不知道(他/她不是OP):)