请考虑以下 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/