2

我试图了解淘汰赛 3.2 组件,但我被卡住了。

我有一个组件“客户”

ko.components.register("customers", {
  viewModel: function (params) {
    var self = this;
    this.customers = ko.observableArray();
    this.selectedCustomerId = ko.observable(1);
    this.selectCustomer = function (data) {
        selectedCustomerId(data.Id);
    };

    $.getJSON('http://localhost:49435/Customer/GetCustomers', this.customers);
},
template: "<div><table class=\"table table-condensed table-responsive\"><thead><tr><th>Customer ID</th><th>Name</th><th>City</th></tr></thead><tbody data-bind=\"foreach: customers\"><tr><td data-bind=\"text: Id\"></td><td data-bind=\"text: Name, click: $root.selectCustomer\"></td><td data-bind=\"text: City\"></td></tr></tbody></table></div>"
});

但是在绑定时,我收到以下错误:

无法处理绑定“点击:函数(){return $root.selectCustomer}”消息:无法读取未定义的属性“selectCustomer”

接下来我要做的是selectedCustomerId与另一个组件通信。这是否可能使用 PubSub 同步以及这如何可能。有人可以给我一个提示从哪里开始。

4

1 回答 1

3

在你的绑定中使用$parent而不是。通常是指传递给方法的视图模型。$root$rootko.applyBindings

此外,您的代码中还有另一个错误 - 在selectCustomer您尝试访问selectedCustomerId不存在的全局变量的方法中。您应该为其添加前缀,self以便能够访问在您的视图模型中创建的局部变量。

var self = this;
    self.customers = ko.observableArray();
    self.selectedCustomerId = params.SelectedCustomer;
    self.selectCustomer = function (data) {
        self.selectedCustomerId(data.Id);
    };

关于传递selectedCustomerId给另一个组件 - 您可以在根视图模型(您传递给ko.applyBindings)中创建 observable,然后将其传递给您的组件,如下所示:

<customers params='SelectedCustomer:selectedCustomer'></customers>

然后在数据绑定时使用这个 observable。检查this fiddle以获取工作示例。

于 2014-08-27T10:51:21.403 回答