0

使用 HTTP GET 从服务器异步获取的数据填充 KnockoutJS 支持的表单的惯用方法是什么?我遇到的问题是,如果我不创建域模型的空虚拟实例(请参见下面的代码),Knockout 会中断,因为它会在调用完成之前尝试调用domainModel().namedomainModel().description表单字段$.getJSON

处理这种情况的常用方法是什么?我应该先做第$.getJSON一个并调用ko.applyBindings(new ViewModel(domainModelData));成功回调还是有其他方法?

HTML 和内联 Javascript:

<form data-bind="submit: update">
    <input id="name" data-bind="value: domainModel().name"/>
    <input id="description" data-bind="value: domainModel().description"/>
    <button type="submit"/>     
</form>


<script type="text/javascript">
    $(document).ready(function () {
        ko.applyBindings(new ViewModel());
    });
</script>

淘汰赛视图模型:

function DomainModel(data) {
    var self = this;
    self.id = ko.observable(data.id);
    self.name = ko.observable(data.name);
    self.description = ko.observable(data.description);
}

function ViewModel() {
    var self = this;

    // This feels somehow dirty
    self.domainModel = ko.observable(new DomainModel({id: null, name: "", description: ""}));

    self.update = function() {
        ...
    };

    $.getJSON("domainModel/<id>", function(domainModelData) {
        self.domainModel(new DomainModel(domainModelData));
    });
}
4

1 回答 1

2

您应该使用 with 绑定或 foreach 绑定来确保对象在绑定尝试解析之前存在 -

<form data-bind="submit: update, with: domainModel">
    <input id="name" data-bind="value: name"/>
    <input id="description" data-bind="value: description"/>
    <button type="submit"/>     
</form>

基本上,直到 domainModel 有值 name 和 description 才会被解析。另一种方法是使用 $data。前缀说'如果没有数据,等到有'

<form data-bind="submit: update">
    <input id="name" data-bind="value: $data.domainModel().name"/>
    <input id="name" data-bind="value: $data.domainModel().description"/>
    <button type="submit"/>     
</form>
于 2013-08-14T13:10:27.817 回答