【问题标题】:functions in knockout components (knockoutjs 3.2+)淘汰组件中的功能(knockoutjs 3.2+)
【发布时间】:2014-08-27 10:03:25
【问题描述】:

我正在尝试理解淘汰赛 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>"
});

但是在绑定的时候出现如下错误:

无法处理绑定"click:function(){return $root.selectCustomer }" 消息:无法读取属性 'selectCustomer' 未定义的

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

【问题讨论】:

  • 你会在任何地方调用 ko.applyBindings 吗?如果是这样,我认为作为参数传递给它的模型被认为是 $root。尝试使用 $parent 而不是 $root。

标签: knockout.js knockout-components


【解决方案1】:

在绑定中使用$parent 而不是$root$root 一般是指传递给ko.applyBindings 方法的视图模型。

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

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

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

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

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

【讨论】:

  • 注意:在 Yevgeniy 的计划下,您可以将 selectedCustomerId 作为 SelectedCustomer 参数传递给子组件。这种做事方式起初对我来说似乎很奇怪,但如果你仔细想想,它已经成为组件与外界的接口。我认为在定义组件的任何地方,将每个组件所采用的参数作为格式良好的注释说明是一种很好的做法。另外,看看 Steve Sanderson 如何拆分 html 和 js:blog.stevensanderson.com/2014/06/11/…
猜你喜欢
  • 1970-01-01
  • 2014-11-08
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多