2017-02-17 12 views
0

Я пытаюсь найти способ создания службы, которая может сидеть на моем уровне самого высокого уровня и удерживать переменные, такие как состояние пользователя и все остальное.Уязвимость привязки AngularJs не обновляется

Сейчас я пытаюсь создать простой пример, в котором я связываю числа вместе. Однако слой пользовательского интерфейса никогда не обновляется, если я не заставляю мой угловой сигнал снова получить значение.

Что произойдет, если вы удалите строку, которая говорит getNumber(), что вы видите, что номер в html никогда не обновляется. Я попробовал называть $ apply и дал мне ошибку, что она уже действует.

Код:

$scope.update = function() { 
     SampleService.update(); 

//Forcing the number to be updated by asking the service to return it 
     $scope.number = SampleService.getNumber(); 

    }; 
//Why doesn't this force $scope.number to change as SampleServce.number changes? 
    $scope.number = SampleService.number; 

Услуги:

(function() { 
'use strict'; 

angular 
    .module('Services') 
    .service('SampleService', SampleService); 

SampleService.$inject = ['$http']; 

function SampleService($http) { 

    var Service = { 
     number: 0 
    }; 


    Service.update = function() 
    { 
     Service.number += 1; 
    }; 

    Service.getNumber = function() 
    { 
     return Service.number; 
    }; 

    return Service; 
} 
})(); 

ответ

0

Это происходит потому, что number является примитивным свойством Service. Значение $scope.number (которое является примитивным) должно быть равно SampleService.number (которое также является примитивным) выполнено ByVal, а не ByRef.

Добавления самого к $scopeSampleServiceобъекта будет создать ссылку как бы возвращая любые объектов, которые являются свойствами SampleService. Вот один из примеров ссылки на службе, а не только одного примитивного объекта:

$scope.service = SampleService; 

{{service.number}} 

http://plnkr.co/edit/eWk8lZRa0dGIhd2I8h9t?p=preview

+0

Я просто понял это, но вместо хранения $ scope.service = SampleService Я делаю это, $ scope.State = SampleService.getData(), который возвращает объект службы из SampleService. Есть ли какие-либо выгоды или недостатки для наших двух подобных, но разных методов? –

+0

Единственная разница между установкой его непосредственно и использованием 'getData()' заключается в том, что с помощью функции 'getData()' ваша служба не должна ничего возвращать. – Claies

+0

Благодарим вас за ответ на этот вопрос и тот, который содержится в комментариях. Мне нравится мой подход getData из-за личной причины, я могу буквально видеть, что я ожидаю свои данные. –

0

Числа, струнные и другие основные типы передаются как значения, а не ссылки, а значит, вы получите реальное число (т.е. 7) и а не адрес Service.number.

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

+0

Я думал, что это то, что я делаю на дне моей Serivce, где я вернуть переменные службы. Потому что в контроллерах я могу вызывать методы на моем SampleService, которые отображаются внутри Сервиса на уровне SampleService. –