我使用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设置值,则不会更新输入框。我是如何设置的?
答案 0 :(得分:2)
您正在初始化您的viewmodel属性,其中包含存储在data
对象及其嵌套内容中的值。
在初始化之后(例如:this.latitude = ko.observable(someValue)
),你的observable只不过是一个带有值的包装器。使用新值调用包装器并更新。 (this.latitude(10)
)在没有值的情况下调用它并将其解包。 (this.latitude(); // 10
)
即:在初始化之后,您不应该触摸data
对象。您可以通过更新viewmodel进行更改。如果要解析回原始格式,您必须自己编写逻辑。
const data = {
visibleByRegisteredUsers: {
latitude: 54
}
};
function AppViewModel() {
/* ... */
this.latitude = ko.observable(data.visibleByRegisteredUsers.latitude);
this.latitude.subscribe(console.log);
};
ko.applyBindings(new AppViewModel);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<input data-bind="textInput: latitude">
&#13;
答案 1 :(得分:0)
这不起作用是正常的。 Knockout使用observable进行数据绑定。您定义的observable在数据对象发生更改时不会收到通知,因为它不是可观察的。您可以做的是在VM中设置一个可观察对象,该对象用全局变量填充。然后订阅它并更新全局。仍然不确定为什么你会想要这个但是嘿;它可能会那样工作。