【问题标题】:Create observable object properties inside an array in knockout.js在 knockout.js 中的数组内创建可观察对象属性
【发布时间】:2015-10-05 23:08:29
【问题描述】:

Knockout.js 文档说 observableArray

仅仅将一个对象放入 observableArray 并不能使该对象的所有属性本身都可观察。当然,如果您愿意,您可以使这些属性可观察,但这是一个独立的选择。

但它没有指定如何使属性可观察。

我有一个 users 数组,我想让属性 name 可观察,以便能够在某些操作下从另一个视图模型更改它。

这是我尝试过但没有成功的方法:

Reproduction online

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);

我该怎么做?

【问题讨论】:

    标签: knockout.js knockout-3.0 knockout-3.2


    【解决方案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);
    

    【讨论】:

    • 别无他法?如果用户有 20 或 30 个属性怎么办?为它创建一个类似乎有点不必要,如果这些属性的数量随时间增加或减少,维护起来会更加困难。
    • 您基本上是在问“我为什么要费心制作域模型?” makinggoodsoftware.com/2010/05/17/…
    • 我认为将我的视图直接绑定到来自服务器的数据非常是不好的做法。中间应该有一层。
    • 好吧,我仍然不知道如何从my example 中的另一个模型更改它,我在其中收到订阅者的信息。
    • 只是一个简单的问题:有没有办法直接将myData 的属性映射到User 类中,而这些属性根本不会被修改?例如:nameid。似乎在处理一个大对象时,必须在 User 中指定它们有点重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2014-10-23
    • 1970-01-01
    • 2019-12-16
    相关资源
    最近更新 更多