2017-10-05 10 views
1

가 나는 설정 속성 b와 함께 사용자 지정 개체 AExtJS 5/6. 내 사용자 지정 개체 구성 특성을 바인딩 할 수있게 만드는 방법? <pre><code>Ext.define('A', { config: { b: 1 }, constructor: function(config) { this.initConfig(config); return this; } }) ; </code></pre> <p></p>가 나는 뷰 모델 생성 :

viewModel: { 
    data: { 
     a: Ext.create('A') 
    } 
}, 

을하지만,이 바인딩 작동하지 않습니다 :

items: [ 
    { 
     xtype:'textfield', 
     bind:'{a.b}' 
    }, 

나는 무엇이다 잘못하고있는거야? https://fiddle.sencha.com/#view/editor&fiddle/27qp

- 업데이트 : 나는 예제이 바이올린을 쓴 내가 코드를 축소 된,하지만 내 실제 뷰 모델에 내가 몇 가지 설정 변수와 객체를 가지고 있다는 사실을 놓친, 나는 것에 대해 생각하고 그것을 뷰 모델과 동기화하고 뷰와 동기화하십시오. 구성 요소에 '참조'가있을 때처럼.

감사합니다.

답변

1

property와 config의 차이점은 클래스 인스턴스로 속성을 호출 할 수 있다는 것입니다. 반면 config는 해당 클래스가 Ext.Base으로 확장 될 때만 setter와 getter로 호출해야합니다. 합니다 (Ext.Base 클래스 constructor은 자리 표시 자입니다. 당신이 Ext.Component에서 클래스를 확장하는 경우는, 따라서. 구성 요소에 대한 모든 작업을 수행하는 Ext.Component 생성자의 필요에 따라 동일한 코드가 작동합니다.)

자,이를 만들기 위해 코드가 작동, 우리는 다음과 같이 수정해야합니다 :

Ext.define('A', { 
    config: { 
    b: 1 
    }, 
    constructor: function (config) { 
    this.initConfig(config); 
    return this; 
    } 
}); 

var objA = Ext.create('A'); 

Ext.create('Ext.window.Window', { 
    title: 'Example', 
    viewModel: { 
    data: { 
     //a: Ext.create('A'), 
     x: objA.getB(), 
    } 
    }, 
    width: 400, 
    layout: 'vbox', 
    items: [{ 
    xtype: 'textfield', 
    reference: 'mytextfield', 
    bind: '{x}' 
    }, { 
    xtype: 'button', 
    text: 'show a.b value', 
    handler: function (button) { 
     alert(this.lookupViewModel().get('x')); 
    } 
    }] 
}).show(); 

나는 당신의 code로 변경했습니다. 희망이 좀 도움이됩니다.

+0

많은 노력을 가져 주셔서 감사합니다. 솔루션에서 발생하는 또 다른 문제는 텍스트 필드가 업데이트 될 때 objA.getB()가 변경되지 않는다는 것입니다. 내 질문에 사과하지 않았기 때문에 나의 비난. 미안. –

+0

"Ext.Component 확장"이 예상 한 트릭을 수행했습니다! :디 –

2

Ext.Class.config은 자동으로 getter 및 setter 메서드를 만드는 데 사용되지만 A.b 클래스 속성 자체를 생성합니다 (여전히 A.config.b).

문제는 Ext.mixin.Bindablebind 또는 publishes 내부 getter와 setter 메소드를 sertain하지, Ext.app.ViewModel 일반적인 get(path)set(path, value) 방법을 사용한다는 것입니다, 그래서 정확히 A.b하지 A.getB() 사용하려고합니다.

이 아닌 b 속성을 클래스 자체에 추가하거나 Ext.app.ViewModel.formulas을 사용해야합니다.

체크 this fiddle.

A.config.b{xtype: 'textfield', bind: '{a.config.b}'}과 같이 사용할 수 있습니다.

+0

설명해 주셔서 감사합니다. 당신의 접근 방식으로 그것은 완벽하게 작동합니다. 나는 Ext.Component를 확장하는 해결책을 고집합니다. 왜냐하면 그것은 여러분의 솔루션이 "순수 주의자"라는 것을 알지만 (실제로 클래스는 실제로 컴포넌트가 아니기 때문에) 깔끔하게 끝나기 때문입니다. 나는 두 가지 대답을 모두 받아 들일 수 있었으면 좋겠다. 나는 너의 것을 "유용하다"고 생각하고 보상하려고 노력할 것이다. –