Как получить обновление Knockout при изменении глобальной переменной

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

function AppViewModel() {
        this.username = ko.observable(data.user.name);
        this.name = ko.observable(data.visibleByRegisteredUsers.name);
        this.phone = ko.observable(data.visibleByRegisteredUsers.phone);
        this.gender = ko.observable(data.visibleByRegisteredUsers.gender);
        this.distance = ko.observable(data.visibleByRegisteredUsers.distance);
        this.address = ko.observable(data.visibleByRegisteredUsers.address);
        this.postcode = ko.observable(data.visibleByRegisteredUsers.postcode);
        this.latitude = ko.observable(data.visibleByRegisteredUsers.latitude);
        this.longitude = ko.observable(data.visibleByRegisteredUsers.longitude);

        this.name.subscribe(function (newData) {
            data.visibleByRegisteredUsers.name = newData;
        });
        this.phone.subscribe(function (newData) {
            data.visibleByRegisteredUsers.phone = newData;
        });
        this.gender.subscribe(function (newGender) {
            data.visibleByRegisteredUsers.gender = newGender;
        });
        this.distance.subscribe(function (newData) {
            data.visibleByRegisteredUsers.distance = newData;
        });
        this.address.subscribe(function (newData) {
            data.visibleByRegisteredUsers.address = newData;
        });
        this.postcode.subscribe(function (newData) {
            data.visibleByRegisteredUsers.postcode = newData;
        });
        this.latitude.subscribe(function (newData) {
            data.visibleByRegisteredUsers.latitude = newData;
        });
        this.longitude.subscribe(function (newData) {
            data.visibleByRegisteredUsers.longitude = newData;
        });


    }

    ko.applyBindings(new AppViewModel()); 

Я привязываю входные значения следующим образом:

<input type = "text" class = "form-control" placeholder = "Lat" id = "lat" aria-describedby = "basic-addon1" required data-bind = "value:latitude">

Если я затем обновлю объект данных, например, установив значение для data.visibleByRegisteredUsers.latitude, поле ввода не будет обновлено. Что-то не так в том, как я это настроил?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
845
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это нормально, что это не работает. Knockout связывает данные с помощью наблюдаемых. Определенные вами наблюдаемые не получают уведомления при изменении объекта данных, поскольку он не является наблюдаемым. Что вы можете сделать, так это установить наблюдаемый объект в виртуальной машине, который заполнен глобальной переменной. Затем подпишитесь на него и обновите глобал как таковой. Все еще не уверен, зачем вам это нужно, но эй; это могло бы работать так.

Ответ принят как подходящий

Вы являетесь инициализация свойствами вашей модели просмотра со значениями, хранящимися в объекте data и его вложенном содержимом.

После инициализация (например: this.latitude = ko.observable(someValue)) ваш наблюдаемый объект представляет собой не что иное, как оболочку со значением. Вызовите оболочку с новым значением, и она обновится. (this.latitude(10)) Вызовите его без значения, и оно развернется. (this.latitude(); // 10)

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

const data = {
  visibleByRegisteredUsers: {
    latitude: 54
  }
};

function AppViewModel() {
  /* ... */
  this.latitude = ko.observable(data.visibleByRegisteredUsers.latitude);
  
  this.latitude.subscribe(console.info);
};

ko.applyBindings(new AppViewModel);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<input data-bind = "textInput: latitude">

Другие вопросы по теме