从knockout 3.2中的自定义组件更新observable

时间:2014-09-15 09:55:07

标签: knockout.js knockout-3.0 knockout-components

我正在尝试使用 knockout 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>

问题是当我click on Up/Down function in my full JS fiddle时。我得到了

  

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

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

我该怎么做呢?

1 个答案:

答案 0 :(得分:10)

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

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

你可以在这里阅读更多knockout 3.2 components(如何将params传递给组件)

  

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

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

Fixed JSFiddle DEMO