Knockout JS - viewModel访问

时间:2011-07-13 20:56:15

标签: javascript knockout.js

我正在写一份预订申请。 预订程序相当复杂,并且有一些依赖性,因此我决定使用knockout来帮助我观察更改并更新UI。

我开始实施客户列表。表单中的第一个客户将是必须输入其详细信息的客户,其他客户只需要姓名。 我想我可以添加一个dependentObservable来检查当前客户是否是customers数组中的第一个客户,以决定是否显示其他字段。

问题在于,当尝试从客户访问viewModel时,我只得到“未定义”。 我尝试将对viewModel的引用传递给客户,但这也不起作用。 我究竟做错了什么?可以访问viewModel吗?

以下是代码:

var customer = function(){
    this.firstName = ko.observable('');
    this.lastName = ko.observable('');
    this.fullName = ko.dependentObservable(
        function(){
            return this.firstName() + " " + this.lastName();
        },
        this
    );
    this.gender = ko.observable('');
    this.diet = ko.observable('');
    this.primaryCustomer = ko.dependentObservable(
        function(){
            console.log(viewModel);
            return viewModel.customers.indexOf(this) == 0;
        },
        this
    );
    this.email = ko.observable('');
}

var viewModel = {
    customers: ko.observableArray([new customer()]),
    addCustomer: function(){
        this.customers.push(new customer());
    },
    removeCustomer: function(customer){
        this.customers.remove(customer);
    }
}


ko.applyBindings(viewModel);

1 个答案:

答案 0 :(得分:5)

我明白了。 将viewModel传递给客户的想法是正确的,只是执​​行不好。当我初始化客户时,我是与一位新客户合作完成的,而这位新客户又寻找那些尚未存在的客户。

这是工作代码:

var customer = function(viewModel){
    this.firstName = ko.observable('');
    this.lastName = ko.observable('');
    this.fullName = ko.dependentObservable(
        function(){
            return this.firstName() + " " + this.lastName();
        },
        this
    );
    this.gender = ko.observable('');
    this.diet = ko.observable('');
    this.primaryCustomer = ko.dependentObservable(
        function(){
            console.log(viewModel);
            return viewModel.customers.indexOf(this) == 0;
        },
        this
    );
    this.email = ko.observable('');
}

var viewModel = {
    customers: ko.observableArray(),
    removeCustomer: function(customer){
        this.customers.remove(customer);
    }
}
viewModel.customers.push(new customer(viewModel));
viewModel.addCustomer = function(){
        viewModel.customers.push(new customer(viewModel));
}

ko.applyBindings(viewModel);