В angular у меня есть объект, который будет отображаться через мое приложение через службу.
Некоторые из полей этого объекта являются динамическими и будут обновляться как обычно с помощью привязок в контроллерах, которые используют эту службу. Но некоторые из полей являются вычисляемыми свойствами, которые зависят от других полей и требуют динамического обновления.
Вот простой пример (который работает над jsbin здесь). Моя модель обслуживания предоставляет поля a, b и c, где c вычисляется из a + B в calcC(). Обратите внимание, что в моем реальном приложении вычисления намного сложнее, но суть здесь.
Единственный способ, с помощью которого я могу заставить это работать, - привязать мою модель обслуживания к $rootScope, а затем использовать $rootScope.$watch для просмотра любого из контроллеров, изменяющих a или b, и когда они делают, пересчитывая c. Но это кажется уродливым. Есть ли лучший способ сделать это?
Вторая проблема - производительность. В моем полном приложении a и b представлены большие списки объектов, которые объединяются до c. Это означает, что функции $rootScope.$watch будут выполнять много глубоких проверок массивов, что звучит так, что это повредит производительности.
У меня есть все, что работает с вычисленным подходом в BackBone, который максимально сокращает перерасчет, но angular, похоже, не очень хорошо работает с запланированным подходом. Любые мысли об этом тоже будут хороши.
Вот пример приложения.
var myModule = angular.module('myModule', []);
//A service providing a model available to multiple controllers
myModule.factory('aModel', function($rootScope) {
var myModel = {
a: 10,
b: 10,
c: null
};
//compute c from a and b
calcC = function() {
myModel.c = parseInt(myModel.a, 10) * parseInt(myModel.b, 10);
};
$rootScope.myModel = myModel;
$rootScope.$watch('myModel.a', calcC);
$rootScope.$watch('myModel.b', calcC);
return myModel;
});
myModule.controller('oneCtrl', function($scope, aModel) {
$scope.aModel = aModel;
});
myModule.controller('twoCtrl', function($scope, aModel) {
$scope.anotherModel = aModel;
});