Обновление ссылочной переменной

0

Я новичок в угловых и 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() довольно обходится с точки зрения производительности.

Мне хотелось бы, чтобы это могло быть правильным решением, или я должен попытаться найти еще более эффективный.

  • 0
    Вы можете обновить свой вопрос, включив в него код, который не дает желаемого эффекта. Непонятно, что именно вы пытаетесь сделать или как вы пытаетесь это сделать.
Теги:
arrays

1 ответ

2
Лучший ответ

обновление $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
});
  • 0
    Павел, его ответ правильный. Однако, чтобы завершить, OP использует «controller as» и поместил ссылку «this» в параметр. Поэтому в своем ответе замените почти все ссылки на $ scope на vm, за исключением $ scope. $ Watch. Кроме того, оператор 'watch' должен начинаться следующим образом: $ scope. $ Watch ('vm.projects', .....);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню