4

我正在尝试使用淘汰赛 3.2中的自定义组件并从组件内更新 observable。这是我的自定义组件的示例:

ko.components.register('voting', {
    viewModel: function(params) {
        var self        = this;
        this.votes      = params.votes;
        this.yourVote   = params.yourVote;

        this.callback   = function(num){
            self.yourVote(parseInt(num));  // here I am updating
            self.votes( self.votes() + parseInt(num) );
        };
    },
    template: { element: 'voting-tpl' }
});

它的模板如下所示:

<voting params="votes: votes(), yourVote: yourVote()"></voting>
<template id="voting-tpl">
    <div data-bind="click:function(){callback(1)}">Up</div>
    <div data-bind="text: votes"></div>
    <div data-bind="click:function(){callback(-1)}">Down</div>
</template>

问题是当我在完整的 JS fiddle 中单击 Up/Down 功能时。我明白了

未捕获的错误:除非您指定“写入”选项,否则无法将值写入 ko.computed。如果您想读取当前值,请不要传递任何参数。

当然,我可以var a = new Vm();从组件内部使用和更新它,a.yourVote(num);但这打破了组件的整体理念。

我怎样才能正确地做到这一点?

4

1 回答 1

11

您应该将 observables 作为参数传递给自定义组件,而不是创建依赖项:

<voting params="votes: votes, yourVote: yourVote"></voting>     

您可以在此处阅读更多内容,淘汰赛 3.2 组件(如何将参数传递给组件)

提供参数来初始化组件,就像在组件绑定中一样,但有一些区别:

  • 如果参数自己创建依赖项(访问可观察对象或计算对象的值),则组件将接收返回值的计算对象。这有助于确保整个组件不需要在参数更改时重新构建。组件本身可以控制它如何访问和处理任何依赖项。

修复了 JSFiddle DEMO

于 2014-09-15T11:44:48.247 回答