Knockout.js文档说observableArray
简单地将对象放入observableArray并不会使该对象的所有属性本身都可观察到。当然,如果您愿意,您可以观察这些属性,但这是一个独立的选择。
但它没有指定如何使属性可观察。
我有一个users
数组,我想让属性name
可观察,以便能够在某些操作下从另一个视图模型中更改它。
这是我尝试过的没有成功的事情:
var shouter = new ko.subscribable();
function usersViewModel() {
var myData = [array of objects];
var self = this;
self.selectedRow = ko.observable();
self.items = ko.observableArray(myData);
self.selectedRow.subscribe(function (newValue) {
console.log(newValue);
shouter.notifySubscribers(newValue, "selectedRow");
});
}
function departmentViewModel() {
var self = this;
self.row = ko.observable();
//getting info from another view model
shouter.subscribe(function (user) {
self.row(user);
console.log(self.row());
self.row().name = ko.observable('Testing!!!');
}, this, "selectedRow");
}
var MasterViewModel = function () {
this.users = new usersViewModel();
this.department = new departmentViewModel();
}
var mm = new MasterViewModel();
ko.applyBindings(mm);
我怎么能这样做?
答案 0 :(得分:1)
您应该创建一个User
类name
作为可观察属性。
function User(userData) {
userData = userData || {};
this.id = userData.id;
this.name = ko.observable(userData.name);
this.status = userData.status;
}
function UsersViewModel() {
var myData = [{
id: "001",
name: "Jhon",
status: "Single"
}, {
id: "002",
name: "Mike",
status: "Married"
}, {
id: "003",
name: "Marrie",
status: "Complicated"
}];
self.users = ko.observableArray(myData.map(function(userData) {
return new User(userData);
});
}
如果由于某种原因你想避免创建User
类,那么你需要将name
属性转换为可观察的其他方式。像这样......
myData.forEach(function (data) {
data.name = ko.observable(data.name);
});
self.users = ko.observableArray(myData);