Ссылка 2 объекта javascript

Я работаю над angularJS-приложением, и я нашел проблему, которую я не могу решить. У меня есть переменная с предопределенным текстом, который я хочу заменить в электронном сообщении фактическими значениями, это выглядит так:

$scope.predefinedVars = {
 'client_name': $scope.itemPartner.name,
 'client_city': $scope.itemPartner.city,
 'client_county': $scope.itemPartner.county,
 'client_address': $scope.itemPartner.address,
 'client_phone': $scope.itemPartner.phone,
 'client_email': $scope.itemPartner.email
};

и так далее...

Теперь, когда я выбираю партнера, объект itemPartner меняет данные. Например: у меня есть функция для просмотра, когда я меняю партнера из поля выбора:

$scope.$watch('newContract.partner_id', function() {
 $scope.itemPartner = _.where($scope.listPartners, {'id': $scope.newContract.partner_id})[0];
 alert(JSON.stringify($scope.itemPartner));
});

Теперь, в предупреждении, я вижу, что данные itemPartner изменились, но если я попытаюсь прочитать значения из моей первой переменной $scope.predefinedVars, значения все еще пусты и не изменяются.

Есть ли способ заставить значения изменить, когда я itemPartner объект itemPartner?

1 ответ

Проблема в том, что вы задали поля вашего объекта predefinedVars примитиву. В javascript примитивы передаются по значению, а не по ссылке (google, если вы не уверены, что это значит).

В результате вся ссылка на объект, который вы использовали для его первоначальной настройки, теряется.

У вас есть несколько альтернатив:

  1. Вместо замены электронной почты, используя данные из $scope.predefinedVars, используйте данные из $scope.itemPartner. Это меньше работает.

  2. создать функцию, которая повторно заполняет predefinedVars

например

function populatePredefinedVars (partner){

 $scope.predefinedVars = {
 'client_name': partner.name,
 'client_city': partner.city,
 'client_county': partner.county,
 'client_address': partner.address,
 'client_phone': partner.phone,
 'client_email': partner.email
 };
}

$scope.$watch('newContract.partner_id', function() {
 $scope.itemPartner = _.where($scope.listPartners, {'id': $scope.newContract.partner_id})[0];
 populatePredefinedVars($scope.itemPartner);
});

licensed under cc by-sa 3.0 with attribution.