Knockout 3.2组件数据上下文

use*_*083 5 data-binding datacontext knockout.js knockout-components

我正在使用Knockout 3.2和新的组件系统.我正在尝试使用包含子组件的组件.

Home Page (component - with HomePageViewModel) NewsFeed1 (component with HomePageViewModel.NewsFeedViewModel1) NewsFeed2 (component with HomePageViewModel.NewsFeedViewModel2)

HomePageViewModel

var viewModel = (function () {
    function viewModel() {
        this.message = ko.observable("Welcome to DKT!");
        this.newsFeedViewModel = new gr.viewModel();
        this.newsFeedViewModel2 = new gr.viewModel();
        this.newsFeedViewModel.message("Message 1");
        this.newsFeedViewModel2.message("Message 2");
    }
    return viewModel;
})();
Run Code Online (Sandbox Code Playgroud)

NewsFeedViewModel

var viewModel = (function () {
    function viewModel() {
        this.message = ko.observable("This is the profile!");
    }
    return viewModel;
})();
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,HomePageViewModel包含了两者NewsFeedViewModel.我现在希望能够将这些作为我的两个组件的DataContext/BindingContext使用,但这似乎不起作用.

Home.html中

<news-feed data-bind="newsFeedViewModel"></news-feed>
<news-feed data-bind="newsFeedViewModel2"></news-feed>
Run Code Online (Sandbox Code Playgroud)

这两个组件都不使用ViewModel,HomePageViewModel而是使用新的NewsFeedViewModel.如何使这两个组件的datacontext绑定到存储在顶层组件(home)中的viewModel?

RP *_*yer 4

一般来说,您希望通过 为您的组件提供任何数据params。例如,根据您的结构,您可以创建如下组件:

ko.components.register("news-feed", {
    viewModel: function (params) {
       this.vm = params.vm;
    },

    template: "<h2>News Feed</h2><div data-bind=\"text: vm.message\"></div>"
});
Run Code Online (Sandbox Code Playgroud)

然后,您将定义如下元素:

<news-feed params="vm: newsFeedViewModel"></news-feed>

<news-feed params="vm: newsFeedViewModel2"></news-feed>
Run Code Online (Sandbox Code Playgroud)

您可以选择message直接为每个参数传递和/或选择对您的参数有意义的任何名称(而不是vm)。

示例: http: //jsfiddle.net/rniemeyer/fssXE/

  • 您遇到了 Knockout 中“click”绑定的限制。当调用事件处理函数时,它总是使用当前的“$data”对象作为“this”值。我的 [Knockout Punches](http://mbest.github.io/knockout.punches/) 库修改了“click”(除其他外)以按照您期望的方式工作:http://jsfiddle.net/fssXE/5/ (2认同)
  • 否则,@user2465083,您可以在组件模板中使用“with:vm”,然后直接绑定到“vm”上的方法/属性,它将具有正确的上下文。这是一个示例:http://jsfiddle.net/rniemeyer/3vE3S/ (2认同)