Я использую нокаут, чтобы привязать значение к некоторым полям ввода. Я также настроил модель для подписки на значения глобальной переменной (данных).
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, поле ввода не будет обновлено. Что-то не так в том, как я это настроил?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это нормально, что это не работает. 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">