如何在全局变量更改中更新Knockout

时间:2018-05-29 11:36:38

标签: javascript knockout.js

我使用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设置值,则不会更新输入框。我是如何设置的?

2 个答案:

答案 0 :(得分:2)

您正在初始化您的viewmodel属性,其中包含存储在data对象及其嵌套内容中的值。

初始化之后(例如:this.latitude = ko.observable(someValue)),你的observable只不过是一个带有值的包装器。使用新值调用包装器并更新。 (this.latitude(10))在没有值的情况下调用它并将其解包。 (this.latitude(); // 10

即:在初始化之后,您不应该触摸data对象。您可以通过更新viewmodel进行更改。如果要解析回原始格式,您必须自己编写逻辑。

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:0)

这不起作用是正常的。 Knockout使用observable进行数据绑定。您定义的observable在数据对象发生更改时不会收到通知,因为它不是可观察的。您可以做的是在VM中设置一个可观察对象,该对象用全局变量填充。然后订阅它并更新全局。仍然不确定为什么你会想要这个但是嘿;它可能会那样工作。