2013-01-04 7 views
2

CoffeeScript의 Backbone.js로 프로그래밍 중이며 lodash 및 병합 기능과 관련하여 상속에 문제가 있습니다.CoffesScript의 상속이 lodash 병합 기능으로 인해 올바르게 작동하지 않습니다.

제가 또한 IndexView 인스턴스에서 변경되는 구성 변수를 초기화 서브 뷰의 함수 내에서 변경하는 경우

class NavigationView extends Backbone.View 
    config: 
    test: 
     string: "Test" 

두 개의 클래스가

class SubView extends NavigationView 

    initialize: -> 
     # Setting the view's template property using the Underscore template method 
    _.merge @config, { 
     test: 
      string: "bla" 
     } 

class IndexView extends NavigationView 
... 

로부터 유도되는 수퍼 클래스가있다.

나는 BackBone.Router 클래스 내에서, 그래서처럼 내 객체를 생성 :

index:() -> 
    # Instantiates a new view which will render the header text to the page 
    new IndexView() 

    sub:() -> 
    new SubView() 

내가 그것을 보여주기 위해 바이올린을 만든 : http://jsfiddle.net/hijolan/9VeND/

모든 아이디어를 어떻게 그렇게 할 수 있나요? hijolan

안부,

+0

당신은 뭔가 다른 당신이 우리를 표시하지 않는 것을 일어나고 있습니다. 귀하의 코드는 [이 예제] (http://jsfiddle.net/ambiguous/vRqGY/)와 어떻게 다른가요? 마지막 코드 블록의 들여 쓰기를 확인하고 싶을 수도 있습니다. 올바른 들여 쓰기는 CoffeeScript에서 매우 중요합니다. –

+0

안녕하세요! 당신은 절대적으로 옳았어요 ... ladash (underscore.js와 같은)에서 _.merge 함수를 사용하여 구성을 초기화하고 부모 구성과 파생 클래스의 구성을 병합하는 구성을 병합했습니다. 전체 구성이 병합되지 않았습니다 (테스트 목적으로 만) 제대로 작동했습니다! 도와 주셔서 감사합니다 ... –

+0

다음 바이올린은 문제를 보여줍니다 : http://jsfiddle.net/hijolan/9VeND/ –

답변

4

귀하의 문제는 _.merge가 현재 위치에서 첫 번째 인자를 수정하는 것입니다 :

_.merge(object [, source1, source2, …])

destination 객체로 소스 객체 (들)의 열거 속성을 병합 . 문서가 destination를 말한다 곳이 정말 object을 의미

참고.

소스의 모든 속성있는 오브젝트에 걸쳐_.extend(destination, *sources)

복사를 확장 : merge의 목적은 _.extend의 깊은 버전으로하고 밑줄 문서는 어떻게되는지에 대한 명시 적있다 대상 개체를 반환하고 대상 개체를 반환하십시오. 당신은 그 lodash의 extend (AKA assign)는 혼합 매개 변수 이름을 가져옵니다 알 수 있습니다

는 :

_.assign(object [, source1, source2, …])

를 할당은 destination 객체에 source 객체 (들)의 열거 속성을 소유하고 있습니다.

다시 말하면 이라고 할 때 object을 의미합니다.

당신이 할 때이 다음 configNavigationView에 대한 프로토 타입에 부착하므로 동일한 config 객체가 NavigationView와 그 서브 클래스 보일 것이다 끝

class NavigationView extends Backbone.View 
    config: 
    test: 
     string: "Test" 

. 즉 @config는 것을 의미 당신의 initialize에서 프로토 타입의 config :

_.merge @config, { test: { string1: "blub" } } 

그렇게 _.merge 바로 프로토 타입의 config에 새 값을 병합하고 그 클래스의 모든 서브 클래스로 모든 길 NavigationView에 아래로 보이는 변화를 만든다 . 당신이 다시 상속을 추적하는 경우, 당신은 그래서 당신의 _.merge 쓰기 단지 까다 롭고 복잡한 방법입니다 맥락에서 @configNavigationView에서 것을 확인할 수있는 것들 :

_.merge NavigationView::config, ... 

문제의 뿌리는 _.extend_.merge 그 첫 번째 인수를 수정하십시오. 이 트랩의 방법은 안전하게 쓸 수있는 대상 개체를 제공하는 것입니다

@config = _.merge { }, @config, { test: { string1: 'blub' } } 
# ----------------^^^ 

데모 : http://jsfiddle.net/ambiguous/7j2FM/

+0

안녕하세요! 정말 고맙습니다! 한편으로는 (쉬운) 해결책을위한 반면 다른 한편으로는 완벽하고 깊은;) 설명 !!!!!!! –

+3

내가 설명 할 수 없다면 나는 그것을 이해하지 못한다. 이해할 수 없다면 나는 대답 할 수 없다. 왜 모든 사람들이'확장 '을하는지 이해할 수 없다. (심지어 jQuery의 [ $ .extend'] (http://api.jquery.com/jQuery.extend/)), 오류가 발생하기 쉽고 "오류가 발생하기 쉬운"기본 동작이되어서는 안됩니다. 나는 그 변명이 성과라고 생각한다. –