2

私は顧客と呼ばれるモデルを持っています:

function customer(id, name, age, comments) {
    var self = this;

    self.Id = id;
    self.Name = name;
    self.Age = age,
        self.Comments = comments;

    self.addCustomer = function () {
        $.ajax({
            url: "/api/customer/",
            type: 'post',
            data: ko.toJSON(this),
            contentType: 'application/json',
            success: function (result) {
                //SOMETHINGS WRONG HERE
                customerVM();
            }
        });
    }
}

顧客を追加した後、顧客のリストが自動的に更新されません。モデルで customerVM() を呼び出すと、viewModel 関数に入りますが、getCustomers 関数には入りません。したがって、viewModel を間違って呼び出しているに違いありません。それは私がデバッグから見ているものです。

リストを表示する関数は、viewModel にあります。

function customerVM() {
    var self = this;
    self.customers = ko.observableArray([]);
    self.getCustomers = function () {
        self.customers.removeAll();
        $.getJSON("/api/customer/", function (data) {
            $.each(data, function (key, val) {
                self.customers.push(new customer(val.Id, val.Name, val.Age, val.Comments));
            });
        });
    };
}

顧客を追加した後、何らかの方法で getCustomers を呼び出す必要があります。どうすればこれを行うことができますか??

これが顧客のhtmlです

<table >
    <thead>
        <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Age</th>
            <th>Comments</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: customers" >
        <tr>
            <td data-bind="text: Id"></td>
            <td data-bind="text: Name"></td>
            <td data-bind="text: Age"></td>
            <td data-bind="text: Comments"></td>
        </tr>
    </tbody>
</table>
<br />
<input type="button" id="btnGetCustomers" value="Get Customers" data-bind="click: getCustomers" />
4

3 に答える 3

1

トムが提案したように applyBindings を実行した場合:

<script type="text/javascript">
    var vm = new customerVM();
    vm.getCustomers();
    ko.applyBindings(vm);
</script>

次に、addCustomer メソッドは次のようになります。

self.addCustomer = function () {
    $.ajax({
        url: "/api/customer/",
        type: 'post',
        data: ko.toJSON(this),
        contentType: 'application/json',
        success: function (result) {
           vm.getCustomers(); //*******THIS IS THE CHANGE YOU NEED
        }
    });
}

ただし、addCustomer メソッドをルート モデルに移動する方が適切であるという Tom の意見には同意します。

于 2013-06-05T21:06:00.613 に答える