Связанная с служебной переменной переменная контроллера AngularJS 1.6.9 не изменяется - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть 2 компонента, которые оба обращаются к услуге.Один компонент доставляет объект, а другой должен его отображать или просто получать.Проблема в том, что после завершения процесса инициализации переменная в компоненте отображения не изменяется.

Я пытался использовать $ scope , $ scope. $ Apply () , this. $ OnChanges , а также $ scope. $ watch для отслеживания переменной, но она всегда остается неизменной.

Этот контроллер из компонента дисплея предоставляет текст, который из поля ввода, находится в объекте.

app.controller("Test2Controller", function ($log, TestService) {

    this.click = function () {
        let that = this;
        TestService.changeText({"text": that.text});
    }
});  

Это служба, которая получает объект исохраняет его в this.currentText .

app.service("TestService", function ($log) {

    this.currentText = {};

    this.changeText = function (obj) {
        this.currentText = obj;
        $log.debug(this.currentText);
    };

    this.getCurrentText = function () {
        return this.currentText;
    };

});  

Это контроллер, который должен затем отображать объект, но даже не может обновить this.text переменная.

app.controller("TestController", function (TestService, $timeout, $log) {

    let that = this;

    this.$onInit = function () {
        this.text =  TestService.getCurrentText();
        //debugging
        this.update();
    };

    //debugging
    this.update = function() {
        $timeout(function () {
            $log.debug(that.text);
            that.update();
        }, 1000);
    }

    //debugging
    this.$onChanges = function (obj) {
        $log.debug(obj);
    }


});  

Я потратил довольно много времени на поиск ответа, но большинство из них связаны с директивами или не работают в моем случае, например, одно решение для помещения объектав другой объект.Я подумал, что мог бы использовать $ broadcast и $ на , но я слышал, чтобы не использовать его.Угловая версия, которую я использую: 1.6.9

1 Ответ

0 голосов
/ 30 сентября 2018

Я вижу проблему с вашим подходом.Вы пытаетесь поделиться единственной ссылкой на объект.Вы хотите поделиться ссылкой на объект один раз и хотите отразить ее везде, где она использовалась.Но, согласно методу changeText, вы устанавливаете новую ссылку на currentText свойство сервиса, которое является неправильным.

Скорее, я бы предложил вам использовать только одну ссылку на объект, и он позаботитсясовместного использования объекта между несколькими контроллерами.

Сервис

app.service("TestService", function ($log) {
    var currentText = {}; // private variable
    // Passing text property explicitly, and changing that property only
    this.changeText = function (text) {
        currentText.text = text; // updating property, not changing reference of an object
        $log.debug(currentText);
    };
    this.getCurrentText = function () {
        return currentText;
    };
});

Теперь из метода changeText просто передайте text, который необходимо изменить, а неновый объект.

...