在淘汰JS中绑定复杂模型

时间:2018-02-01 12:10:22

标签: javascript jquery knockout.js knockout-2.0

我有以下JSON复杂对象。

{"User":
    {
    "$id":"2",
    "Id":0,
    "FirstName":null,
    "LastName":null,
    "Email":null,
    "EmailConfirmed":false,
    "PasswordHash":null,
    }
}

如何在knockout js中绑定此对象。到目前为止,我已经使用了类似这样的东西来绑定属性和输入字段。

<input required class="form-control" data-bind="value: User.FirstName" type="text" />

功能bo在淘汰赛中建立模型。

function userModel() {
        var self = this;
        self.User = ko.observable();
    }

    function bindData(data) {
        userInfo.User(data["User"]);
    }

当我通过JS致电提交时。

var jsonData = ko.toJSON(userInfo);

对象jsonData显示像FirstName这样的属性为null,但是已经写入了公式值。 对象userInfo以公式形式存储写入的值,我已经检查过它。

看起来应该是这样吗?

function userModel() {
        var self = this;
        self.Password = ko.observable();
        self.User = ko.observable();
    }

    function UserViewModel(user) {
        this.FirstName = ko.observable(user.FirstName);
        this.LastName = ko.observable(user.LastName);
        // other properties
    }

    function bindData(data) {
        userInfo.Password(data["Password"]);
        userInfo.User(new UserViewModel(data["User"]));
    }

$(document).ready(function () {
        userInfo = new userModel();
        createUser();
        ko.applyBindings(userInfo);
    });

1 个答案:

答案 0 :(得分:1)

对于双向绑定工作,您需要在视图模型上构建相同的可观察值层次结构。

或者,您可以使用mapping plugin

由于User也是一个可观察的,你必须更新你的绑定:

<input required class="form-control" data-bind="value: User().FirstName" type="text" />

由于用户拥有大量属性,因此您可以从with binding

中受益

这是两个例子(有和没有父绑定)的小提琴

var data = {
  "User": {
    "$id": "2",
    "Id": 0,
    "FirstName": "Joseph",
    "LastName": "Campbell",
    "Email": null,
    "EmailConfirmed": false,
    "PasswordHash": null,
  }
}

function UserViewModel(user) {
  this.FirstName = ko.observable(user.FirstName);
  this.LastName = ko.observable(user.LastName);
  // other properties
}

function bindData(data) {
  userInfo.User(new UserViewModel(data["User"]));
}

function userModel() {
  var self = this;
  self.User = ko.observable();
}

var userInfo = new userModel();
bindData(data);

ko.applyBindings(userInfo);
input {
  display: block;
  margin: 5px 0;
}

input[readonly] {
  border: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

<form data-bind="with: User">
  <input type="text" data-bind="value: FirstName" />
  <input type="text" data-bind="value: LastName" />
</form>

Current values:
<input type="text" readonly data-bind="value: User().FirstName" />
<input type="text" readonly data-bind="value: User().LastName" />