В 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;
});