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