Я новичок в угловых и javascript в целом, и я застрял в том, что может быть простой проблемой. В принципе, у меня есть контроллер, который содержит некоторые переменные
(function ()
{
'use strict';
angular
.module('app.project')
.controller('ProjectController', ProjectController);
/** @ngInject */
function ProjectController($document, $mdDialog, $mdSidenav, Tasks, Tags, DashboardData)
{
// Methods
var vm = this;
vm.projects=[
{name: 'proj1'},
{name: 'proj2'},
{name: 'proj3'}
];
vm.selectedProject = vm.projects[0];
....
2 переменными, представляющими интерес, являются проекты массивов и ссылка selectedProject.
В моем приложении я использую службу, чтобы открыть модальный, который позволяет пользователю удалять проект из массива. Проблема в том, что я не могу найти способ обновить выбранный проект, если выбранный проект удален из массива. Насколько я понимаю, после удаления объекта из массива внутри кода службы selectedProject все еще содержит ссылку на этот объект.
Я пробовал несколько подходов за последние пару дней, и теперь я пытаюсь использовать watch() для длины массива, так что когда он изменится, я могу изменить значение "point" selectedProject. У меня все еще нет рабочего решения, но проверка вокруг этого выглядит так: watch() довольно обходится с точки зрения производительности.
Мне хотелось бы, чтобы это могло быть правильным решением, или я должен попытаться найти еще более эффективный.
обновление $scope.selected
может быть выполнено с помощью прослушивателя часов, вам нужно убедиться, что ваша служба обновляет переменную проектов внутри вашей области действия, чтобы изменения были подобраны.
$scope.$watch('projects', function(newValue, oldValue) {
if (newValue != oldValue && $scope.projects.length) {
$scope.selected = $scope.projects[0];
}
}, true);
ОБНОВИТЬ
Если ваш контроллер был написан в Controller как синтаксис, вам нужно будет предоставить функцию watchExpression для ваших $ watch. Обратите внимание, что вам нужно связать значение контроллера для this
с функцией watchExpression, чтобы получить доступ к переменной, которую вы хотите просмотреть:
// $watch with Controller as syntax
$scope.$watch(angular.bind(this, function() {
return this.projects;
}), function(newValue, oldValue) {
// newValue is the changed value
});