customerOverview ビュー モデルでオブザーバブルの長さを呼び出すと、長さゼロを受け取ります。バインディングがデータで更新されるため、オブザーバブルにデータが存在しますが、長さは 0 のままです。基本ビュー モデル 'CustomerCentral' は長さを適切に返します。いくつかの条件ステートメントを実行するには、「CustomerOverview」のオブザーバブルの長さが必要です。
HTML バインディング
<ul class="nav nav-list">
<li class="nav-header">Contacts</li>
<!--ko if: customerOverview.contacts().length == 0-->
<li>No contacts associated with this customer</li>
<!-- /ko -->
<!--ko foreach: customerOverview.contacts()-->
<li>
<a data-bind="click: $root.customerOverview.viewContact"><i class="icon-chevron- right single pull-right">
</i><span data-bind="text: FirstName"></span><span data-bind="text: LastName"></span>
</a></li>
<!-- /ko -->
</ul>
JS
function CustomerOverview() {
var self = this;
self.contacts = ko.observableArray([]);
self.getCustomerContacts = function () {
requestController = "/CRM/CustomerCentral/CustomerContacts";
queryString = "?id=" + self.customer().Id();
$.ajax({
cache: false,
type: "GET",
dataType: "json",
url: baseURL + requestController + queryString,
headers: { "AuthToken": cookie },
success:
function (data) {
if (data.data.length > 0) {
self.contacts(ko.mapping.fromJS(data.data));
console.log(self.contacts().length);
}
}
});
};
};
function CustomerCentral() {
var self = this;
self.customerOverview = ko.observable(new customerOverview());
};
var vm = new CustomerCentral();
ko.applyBindings(vm);
コンソール コマンド: vm.customerOverview().contacts().length 0
- - - - - - - - - - - - - -解決 - - - - - - - - - - - observableArray.push()
問題は次の行であることが判明しました:
self.contacts(ko.mapping.fromJS(data.data));
解決策: これに .push() を追加すると、配列の長さプロパティをインクリメントできるようになりました。私は ko.mapping がこれを処理すると思っていましたが、そうではありません。変数を観測可能に変更しても効果はありませんでした。
$.each(data.data, function () {
self.contacts.push(ko.mapping.fromJS(this));
console.log(self.contacts().length);
});