2017-02-23 4 views
1

KO 구성 요소는 params로 전달할 때 관찰 가능 참조를 수신합니다. 구성 요소가 참조로 수신하면이 관찰 가능에 쓸 수 있으며 뷰 모델에 반영됩니다. 그러나 ko-es5 플러그인 (super awesome)을 사용하는 경우 KO 구성 요소를 수신하는 대신 observable에 대한 참조가 computeObservable의 일부를 수신하므로 KO 구성 요소에 쓸 수 없습니다. 이것은 예기치 않은 행동입니까?knockoutjs 구성 요소의 내부에서 param으로 수신 된 관찰 가능 항목에 쓸 수 없습니다.

http://jsfiddle.net/kapuca/k0fw8w18/

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

<template id="voting-tpl"> 
    <button data-bind="click: increment ">Up</button> 
    <div data-bind="text: votes"></div> 
</template> 

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

     self.increment = function(){ 
      self.votes(self.votes() + 1); 
     }; 

     return self; 
    }, 
    template: { element: 'voting-tpl' } 
}); 

function Vm(){ 
    this.votes = ko.observable(5); 
    return this; 
} 

ko.applyBindings(new Vm()); 

내가 ES5 플러그인을 사용하지 않은

http://jsfiddle.net/kapuca/jwea6zaL/

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

<template id="voting-tpl"> 
    <button data-bind="click: increment ">Up</button> 
    <div data-bind="text: votes"></div> 
</template> 

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

     self.increment = function(){ 
      self.votes(self.votes + 1); 
     }; 

     return ko.track(self); 
    }, 
    template: { element: 'voting-tpl' } 
}); 

function Vm(){ 
    this.votes = 5; 
    return ko.track(this); 
} 

ko.applyBindings(new Vm()); 

답변

1

녹아웃 + 코 ES5 플러그인을 사용하여 시도 만 녹아웃 사용하여 시도 하지만 당신이 접근 할 수있는 문서를보고 ko.getObservable (viewModel, 'propertyName')을 사용하여 관찰 할 수 있습니다. 그래서 만약 당신이 당신의 구성 요소를 바꾸어서 기이 한 관찰 할 수있는 것을 그 매개 변수에 전달하면 이상한 일이 일어나지 않는 곳을 우회하는 것처럼 보입니다.

<voting params="votes: ko.getObservable($data, 'votes')"></voting> 

당신은 대신 함수처럼 투표를 호출 ES5 할당을 사용하도록 증가 기능을 변경할 수 있습니다 self.votes(self.votes + 1); =>self.votes += 1;

+0

덕분에,'ko.getObservable ($ 데이터를 사용하여 sintaxe ' 투표 ')'좋은 것입니다. 나는 그것을 수행하고'와 같이 사용하는 함수를 작성하고 있었다. 어쨌든 당신은 이것이 예상 된 행동이 아니라는 것에 동의해야합니다. 고마워요. –