2012-12-12 3 views
2

knockout.js에서 바인딩의 오른쪽 (바인딩 값)을 동적으로 설정할 수 있습니까? 예를 들어,knockout.js에서 동적 바인딩 값을 사용할 수 있습니까?

<input data-bind="value: dynamicBinding()"/> 
<script type="text/javascript"> 
var vm = { 
    dynamicBinding : function() { 
     return "foo().bar"; 
    }, 
    foo : ko.observable({ 
     bar : ko.observable("hi"); 
    } 
}; 
ko.applyBindings(vm); 
</script> 

결과 상기 dynamicBinding 함수 바인딩을인가하면서 실행하고, 생성 된 문자열 결합로서 사용되는 것일 것이다. 입력 요소는 foo().bar으로 바인딩되어야하며,이 값은 "hi"값으로 관찰 가능합니다.

내가 왜 이것을 원할 수 있는지 궁금하다면 knockout을 사용하여 행과 열이 모두 observableArrays 인 동적 테이블을 렌더링하려고하는데 열 정의에 바인딩 표현식이 포함되도록하고 싶습니다. 그 열. 즉, 나는이 작업을 수행 할 수 있도록하려면 : 당신이 예에서 볼 수 있듯이

<table data-bind="foreach: data"> 
    <tr data-bind="foreach: $root.columns"> 
    <td data-bind="text: cellValueBinding()"></td> 
    </tr> 
</table> 
<script type="text/javascript"> 
var vm = { 
    data: ko.mapping.fromJS([ 
    {title: "Brave New World", author: { name : "Aldous Huxley" }, 
    {title: "1984", author: { name : "George Orwell" }, 
    {title: "Pale Fire", author: { name : "Vladimir Nabokov" }]), 
    columns: ko.observableArray([ 
    {header: "Title", cellValueBinding: function() { return "$parent.title"; }}, 
    {header: "Author", cellValueBinding: function() { return "$parent.author().name"; }} 
    ]) 
}; 
ko.applyBindings(vm); 
</script> 

는 열 정의는 데이터에서 값을 추출하는 방법을 알고있다. 테이블 마크 업 자체가 더 많거나 적은 자리 표시 자입니다. 그러나 내가 알 수있는 한, 이것이 녹아웃이 바인딩을 처리하는 방식 때문에 작동하지 않습니다. 다른 옵션도 있습니까?

감사합니다.


솔루션 : 나는 일리아의 제안을 사용하여 종료 - 나는 cellValueBinding가 인수로 행과 열을 받아들이고, 관찰을 반환하는 함수가 될 수 있도록 할 수 있습니다. 이 기술은 시연되었습니다 in this fiddle.

+0

동적으로 실행하려면 _with /'eval'을 사용해야합니다. 거기에 아무것도 할 녹아웃에 내장되어 있습니다. –

+0

글쎄, 대안을 환영합니다. :) 템플릿 (각 열은 자체 셀 템플릿을 정의 함)을 사용하여 꽤 쉽게 같은 것을 얻을 수 있다고 확신하지만, 너무 무거운 무게를 느낍니다. – waxwing

+0

내 테이블 바인딩에 관심이있을 수 있습니다 : https://github.com/mbest/knockout-table –

답변

2

ko.computed을 사용하십시오. 예에

JSFiddle
두 번째 예에서 편집
, 당신은 $parent 값 TI 기능

<td data-bind="text: cellValueBinding($parent)"></td> 

과의 모델을 통과 할 수

{header: "Title", cellValueBinding: function (parent) { return parent.title; }}, 
{header: "Author", cellValueBinding: function (parent) { return parent.author().name; }} 

JSFiddle

+1

고마워,하지만 내 두 번째 예제에서 어떻게 작동하는지 모르겠다. 바인딩이 열 정의에 있어야합니다. 계산 된 작업에 대해서는 상황에 따라 달라야합니다. 특히 "$ parent"컨텍스트 변수에 액세스 할 수 있어야합니다. – waxwing

+0

@waxwing 응답이 편집 됨 – Ilya

+0

이것은 실제로 작동 할 수 있습니다. 나는 실제 관찰 대상 (및 가치와 같은 양방향 바인딩)에서는 작동하지 않을 것이라고 예상했기 때문에 귀하의 바이올린을 확장했지만 괜찮은 것 같습니다 : http://jsfiddle.net/7vCNt/2/. 내일이 코드를 테스트 할 것입니다. 감사. – waxwing

관련 문제