【问题标题】:Accessing KO component fields in viewmodel在视图模型中访问 KO 组件字段
【发布时间】:2015-03-29 01:04:44
【问题描述】:

我已经创建了我的第一个 KO 组件:

components.js

ko.components.register('team-dropdown', {
    viewModel: function (params) {

        var self = this;
        self.teamNames = ko.observableArray([]);

        $.ajax({
                url: 'http://footballcomps.cloudapp.net/Teams',
                type: 'get',
                contentType: 'application/json',
                success: function (data) {
                    $.each(data['value'], function (key, value) {
                        self.teamNames.push(value.TeamName);
                    });
                    console.dir(self.teamNames);
                },
                error: function (err) {
                    console.log(err);
                }
            });

        self.selectedTeam = ko.observable();
    },
    template: { require: 'text!components/team-dropdown.html' }
});

team-dropdown.html

<div id="teams" class="inputBlock form-group">
<select class="form-control" name="teamName" data-bind="options: teamNames, value:selectedTeam"></select>
<label id="lblHomeTeam" data-bind="text: selectedTeam"></label>

这是我想在哪里使用该组件的观点:

<div class="row" id="divFixture">
<div class="col-md-4">
    <div class="panel panel-info">
        <div class="panel-heading">
            <h2 class="panel-title">Add new fixture</h2>
        </div>
        <div class="panel-body">

            <form data-bind="submit: fixture.addFixture">
                <div class="form-group">
                    <team-dropdown />
                </div>....
            </form>

还有我的精简视图模型:

define(['knockout', 'knockout.validation', 'common', 'components'], function (ko) {

    return function fixtureViewModel() {

        function fixture(fixtureId, fixtureDate, homeId, homeName, homeBadge, homeScore, awayId, awayName, awayBadge, awayScore) {
            this.FixtureId = fixtureId;
            this.FixtureDate = fixtureDate;
            this.HomeId = homeId;
            this.HomeName = homeName;
            this.HomeBadge = homeBadge;
            this.HomeScore = homeScore;
            this.AwayId = awayId;
            this.AwayName = awayName;
            this.AwayBadge = awayBadge;
            this.AwayScore = awayScore;
        }

        var self = this;

        self.Id = ko.observable();
        self.FixtureDate = ko.observable();
        self.HomeId = ko.observable();
        self.HomeName = ko.observable();
        self.HomeBadge = ko.observable();
        self.HomeScore = ko.observable();
        self.AwayId = ko.observable();
        self.AwayName = ko.observable();
        self.AwayBadge = ko.observable();
        self.AwayScore = ko.observable();

        self.selectedTeam = ko.observable();

        self.addFixture = function() {

            //how do I reference the selected item from my component here?

    };     
});

如何在 self.addFixture 中引用我在组件中选择的项目?

【问题讨论】:

    标签: javascript knockout.js knockout-components


    【解决方案1】:

    由于team-dropdown 是一个可重用的组件,您应该提供一种绑定到它的方法。正如你所拥有的,它是一个独立的控件,外界无法与它交互,除非通过你定义的 observables,这不会使其非常灵活。

    我会向它添加参数,您可以在其中设置要绑定到值的可观察对象。您的固定装置有一个 selectedTeam 属性,因此这似乎是一个可能的候选对象。

    ko.components.register('team-dropdown', {
        viewModel: function (params) {
            var self = this,
                teamNames = ko.observableArray([]),
                // default to a local observable if value not provided
                selectedTeam = params.value || ko.observable();
    
            // you probably don't want others to directly modify the teamNames array
            self.teamNames = ko.pureComputed(teamNames);
            self.selectedTeam = selectedTeam;
    
            $.ajax({
                url: 'http://footballcomps.cloudapp.net/Teams',
                type: 'get',
                contentType: 'application/json',
                success: function (data) {
                    $.each(data['value'], function (key, value) {
                        // push to the local `teamNames` array
                        teamNames.push(value.TeamName);
                    });
                    console.dir(teamNames);
                },
                error: function (err) {
                    console.log(err);
                }
            });
        },
        template: { require: 'text!components/team-dropdown.html' }
    });
    

    然后在使用组件时设置参数:

    <form data-bind="submit: fixture.addFixture">
        <div class="form-group">
            <team-dropdown params="value: fixture.selectedTeam" />
        </div>
    </form>
    

    现在应该在您的灯具的selectedTeam 中设置选定的值,所以您可以直接使用它。

    self.addFixture = function() {
        var selectedTeam = self.selectedTeam(); // should have the value
    };
    

    【讨论】:

    • 但是组件的想法不是可以将它们插入到各种视图模型中吗?例如,如果我有一个 datepicker 组件并且我想在许多不同的视图模型中使用它怎么办?这就是我试图在这里实现的想法。
    • 我可能只是对您的示例中使用的内容有错误的高级图片。什么是主视图模型? “添加”了什么?
    • 我没有一个传统 KO 意义上的“主”视图模型,我将有几个视图模型,例如 fixtureViewModel、teamViewModel 等。fixtureViewModel 是上面第三个代码示例中的一个,我将使用它来查看/添加/编辑/删除夹具,其中将包括团队名称、日期、分数等。我计划在夹具和团队视图模型以及以后可能的其他视图模型中使用的团队组件。 AddFixture 会将一个新的夹具添加到夹具数组中,该数组将被写入后端数据库。
    • 好的,我想我对所有事物的交互方式有了更好的了解。组件team-dropwdown 旨在在组合其他视图时使用。在这种情况下,您只需要一种通用方法来访问/绑定到该值。
    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 2021-06-28
    • 2016-06-25
    • 1970-01-01
    • 2022-07-09
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多