2016-09-02 1 views
0

내 컨트롤러의 온도 속성을 내 설정 개체의 temp 속성에 바인딩하려고합니다. 내가 엠 생성 된 컨트롤러 파일 응용 프로그램이 시도하고/컨트롤러/home.jsEmber.js가 Ember 객체 속성을 컨트롤러 속성에 바인딩하고 있습니까?

var settings = Ember.Object.create({ 
    temp: 66 
}); 

export default Ember.Controller.extend({ 
    temperatureBinding: "settings.temp" 
}); 

다른 해결 방법을 시도하는 동안 나는이 코드는 내 설정과 같이 객체를 생성 할 때 작동하는 것을 발견 :

App = Ember.Application.create(); 
 

 
App.settings = Ember.Object.create({ 
 
    temp: 65 
 
}) 
 

 
App.Controller = Ember.Controller.extend({ 
 
    temperatureBinding: 'App.settings.temp', 
 
})
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>Ember Starter Kit</title> 
 
    <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.1/normalize.css"> 
 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
    <script src="http://builds.emberjs.com/tags/v1.13.5/ember-template-compiler.js"></script> 
 
    <script src="http://builds.emberjs.com/tags/v1.13.5/ember.debug.js"></script> 
 
</head> 
 
<body> 
 

 
    <script type="text/x-handlebars"> 
 
    Temperature: {{temperature}} 
 
    </script> 
 

 
</body> 
 
</html>
내 home.js이를 시도 할 때

불행하게도 응용 프로그램이 해당 파일에 정의되어 있지 않기 때문에이 오류가 발생합니다 파일. Ember와 데이터 바인딩을 가능하게하는 방법입니까? 그렇다면, 내가 뭘 잘못하고 있니?

답변

1

알림 : bindings are deprecated and should not be used.

이제 사례를 논의 해 보겠습니다. 그 settings 변수에 액세스 할 수있는 방법이 없으므로 첫 번째 예제는 작동하지 않습니다. 이것은 JavaScript의 제한 사항입니다. 파일의 클로저 컨텍스트에서의 변수이며, 현재 또는 외부 클로저 컨텍스트에 동적으로 액세스 할 수있는 방법이 없습니다.

따라서 문자열이 "foo" 인 경우 foo 변수에 액세스 할 수 없습니다.

두 번째 예제는 일부 이상한 마법 때문에 작동하며 더 이상 사용하지 않아야합니다!

기본적으로 바인딩이 대문자 (예 : A)로 시작하는 경우 엠버는 전체 window 컨텍스트에서 문제를 해결하려고 시도합니다. 응용 프로그램을 로컬 범위에 선언 했으므로 (var은 앞에 붙지 않습니다.) 을 수행하여에 액세스 window.App.settings.temp을 액세스 할 수 있습니다. 그래도 사용하지 마세요.


당신이 사용 특성 및 서비스를 계산해야합니까. 글로벌 상태가 있다면 서비스를 만드십시오! 따라서 대문자로 바인딩하는 대신 서비스를 사용하십시오!

간단한 별칭을 사용하여 this.get('foo.bar')을 쓸 필요가 없으며 this.get('bar')으로 작성하려면 계산 된 속성을 사용해야합니다.

myService: Ember.inject.service(), 
foo: Ember.computed.alias('myService.foo'), 

당신이 그렇게 당신이 할 경우 :

대신

barBinding: 'foo.bar', 

bar: Ember.computed.alias('foo.bar'), 

을 당신은 바인딩 대문자 같은 것을 가지고 서비스를이 결합 할 수 있습니다 foo 속성은 해당 항목의 foo 속성에 대한 별칭입니다. rvice 및 너무 글로벌.예상대로

var settings = {foo: 12}; 
export default Ember.Controller.export({ 
    settings:settings, 
    foo: Ember.computed.alias('settings.foo'), 
}); 

이 한 가지를 제외하고 작동합니다 : 당신이 항상 단지 타다 남은 개체로 변수 인을 배치해야합니까 수 그러나 무엇


설정 개체는 타다 남은 아니다 개체와 그렇게 관찰 할 수 없습니다. settings.foo=42; 일 경우 foo 계산 된 속성은을 업데이트하지 않습니다.

+0

이것은 내 질문에 완벽하게 답변했습니다. 감사합니다. –

관련 문제