在customerOverview视图模型中调用任何observable的长度时,我会收到零长度。随着绑定随数据更新,可观察数据中存在数据,但长度保持为0.基本视图模型'CustomerCentral'正确返回长度。我需要'CustomerOverview'中一些observable的长度来做一些条件语句。
<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>
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);
Console cmd:vm.customerOverview()。contacts()。length 0
---------------------------解决方案------------------- --- observableArray.push()
问题是这一行:
self.contacts(ko.mapping.fromJS(data.data));
解: 将.push()添加到此处可以使数组的length属性递增。我曾假设ko.mapping会处理这个问题,但事实并非如此。将变量更改为observable无效。
$.each(data.data, function () {
self.contacts.push(ko.mapping.fromJS(this));
console.log(self.contacts().length);
});
答案 0 :(得分:6)
我认为您的问题不是将customerOverview
属性视为可观察的
尝试:
self.customerOverview = ko.observable(new CustomerOverview());
或
self.customerOverview = ko.computed(function(){
return new CustomerOverview();
});
工作样本:
http://jsfiddle.net/dvdrom000/RHhmY/1/
<span data-bind="text: customerOverview().contacts().length"></span>
<button data-bind="click: customerOverview().getCustomerContacts">Get contacts</button>
function CustomerOverview() {
var self = this;
self.contacts = ko.observableArray([]);
self.getCustomerContacts = function () {
self.contacts.push(1);
self.contacts.push(2);
self.contacts.push(3);
};
};
function CustomerCentral() {
var self = this;
// Is this a correct way. Am I breaking something with this?
self.customerOverview = ko.observable(new CustomerOverview());
};
var vm = new CustomerCentral();
ko.applyBindings(vm);
答案 1 :(得分:2)
Knockout为数组提供了一组操作函数 镜像JavaScript中的函数;流行,推,移, 不加速,反向,排序和拼接。随着表演 您期望的操作,这些数组函数也将自动执行 通知任何观察者数组已更改。 JavaScript 方法不会。如果您希望在数组计数时更新UI 改变,你要小心使用Knockout函数。
参考:http://ryanrahlf.com/knockout-js-observablearray-not-updating-the-ui-heres-how-to-fix-it/
所以基本上,要解决你的问题,你只需要直接在可观察数组上使用knockout push函数,而不是使用javascript push方法。因此:
改变这个:
self.contacts( ).push( data.data );
由此:
self.contacts.push( data.data );
您将能够在html上使用contacts()。length属性,并在数组中的每次更改时收到通知。
答案 2 :(得分:1)
问题是这一行:
self.contacts(ko.mapping.fromJS(data.data));
解决方案:在此处添加.push()可以使数组的length属性递增。我曾假设ko.mapping会处理这个问题,但事实并非如此。将变量更改为observable无效。
$.each(data.data, function () {
self.contacts.push(ko.mapping.fromJS(this));
console.log(self.contacts().length);
});
答案 3 :(得分:0)
我有这样的问题和IIRC,这是因为我在评论条件中使用了双等号(==)而不是三等号(===)。试一试。
答案 4 :(得分:0)
而不是:
self.contacts(ko.mapping.fromJS(data.data));
你应该:
self.contacts(ko.mapping.fromJS(data.data)**()**);