2012-03-15 5 views
0

현재 백본 로컬 스토리지 어댑터 1, underscore.js 1.2.2 및 jquery mobile 1.0.1을 사용하는 backbone.js 0.5.3을 사용하는 웹 응용 프로그램이 있습니다. 내 버전의 백본과 밑줄을 업그레이드하고 싶었지만 내 버전의 밑줄 (1.2.2에서 1.3.1)을 업그레이드 할 때 backbone.js에서 오류가 발생했습니다 (아래 오류에 대해 자세히 설명합니다). 밑줄을 업그레이드하고 밑줄과 백본을 모두 업그레이드하려고 시도했지만 여전히 오류가 발생합니다. 밑줄에 대한 변경 내역의 변경 사항이 보이지 않지만 어쩌면 내가 누락되었습니다.underscore.js를 업그레이드하면 backbone.js가 깨집니다.

여기에 backbone.js에 들어있는 자바 스크립트 오류에 대한 자세한 내용이 나와 있습니다. 오류 메시지는 "this.model은 생성자가 아닙니다."또는 "Uncaught TypeError : undefined is not function in chrome"입니다. . 이 오류는 backbone.collection의 _prepareModel 메서드에서 throw됩니다.이 메서드는 내 코드 (서버가 아닌 로컬 저장소에서 가져 오는)에서 페치 호출에 따라 트리거되는 add 메서드에 의해 호출됩니다. 내가 볼 수있는 것은 "모델"이 정의되지 않았다는 것입니다 (나는 함수라고 생각합니다). 메서드에서 에러가 발생하는 이유는 무엇인지에 대해 잘 모릅니다.

여기 정말 난 그냥 컬렉션 가져 오기 전화 드렸습니다 때문에 내가 게시 할 수있는 내 자신의 코드의 많은 부분이없는 _prepareModel 방법

_prepareModel: function(model, options) { 
    if (!(model instanceof Backbone.Model)) { 
    var attrs = model; 
    options.collection = this; 
    model = new this.model(attrs, options); 
    if (!model._validate(model.attributes, options)) model = false; 
    } else if (!model.collection) { 
    model.collection = this; 
    } 
    return model; 
}, 

의 코드입니다.

감사

편집

는 여기에 대해 이야기하고 문제를 재현하는 코드입니다. underscore.js 버전 1.2.2를 사용하면 1.3.1을 바꾸면 오류가 발생합니다.

var YM = YM || {}; 
YM.Holidays = YM.Holidays || {}; 

YM.Holidays = { 

Holiday: Backbone.Model.extend({ 
    fDate: null, 
    Description: null, 
}), 

HolidayView: Backbone.View.extend({ 

    tagName: 'li', 

holidayTemplate: null, 

initialize: function() { 
    this.holidayTemplate = _.template($('#holiday-template').html()); 
}, 

render: function() { 
    $(this.el).html(this.holidayTemplate(this.model.toJSON())); 
    return this; 
}, 
}), 

Holidays: Backbone.Collection.extend({ 
    model: YM.Holidays.Holiday 
}), 

HolidayListView: Backbone.View.extend({ 

el: 'body', 

initialize: function() { 
    this.collection = YM.holidays; 
}, 

render: function() { 
    var $holidayList = $('#ulHolidays'); 
    _.each(this.collection.models, function (holiday) { 
     var view = new YM.Holidays.HolidayView({ model: holiday}); 
     $holidayList.append(view.render().el); 
    }, this); 
} 
}) 

}; 


$(function() { 

var holidays = [ {fDate: '1/1/2012', Description: 'New Years'} 
         , {fDate: '1/16/2012', Description: 'ML King Day'} 
         , {fDate: '2/20/2012', Description: 'Presidents Day'}]; 
YM.holidays = new YM.Holidays.Holidays(); 
YM.holidayListView = new YM.Holidays.HolidayListView(); 
YM.holidays.add(holidays); 
YM.holidayListView.render(); 
}); 

편집 2

그것은 조금 낯선를 얻을, 문제가 어떻게 든 JQuery와 모바일 관련이있다처럼, 나는 그 조금 더를 조사 할 계획 보인다. 그 동안 여기에 두 버전이 있는데, 두 버전의 차이점은 그들이 사용하는 밑줄의 버전입니다.

http://jsfiddle.net/KDMcd/ - 내 테스트 예에서 작동하는, http://jsfiddle.net/hnGAA/이 -underscore 1.3.1

EDIT 3

감사를 작동하지 않습니다 1.2.2 을 작동 강조 나는 것을 시도하는거야 내 실제 프로젝트에서. 모델을 나중에 명시 적으로 설정해야하는 이유가 무엇인지 알고 있습니까? 내가하고 있었던 방식이 문서화에 기반하여 수행되는 방식 인 것 같습니다. 또한 어떤 생각이 밑줄을 넣어 무엇이 바뀌 었는가?

OK 덕분에, 내가 명시 적으로 대신

Holidays: Backbone.Collection.extend({ 
    model: YM.Holidays.Holiday 
    }), 

나는이 일을 해요의 초기화 방법에 백본의 콜렉션의 모델을 설정하는 것입니다 일을 결국 무엇을 ryanmarc의 대답에 따라 문제를 해결 할 수 있었다 나는 그것이 또한 오류가 발생하지 않는 JQM 페이지에 반대 일반 사업부의 목록을 (렌더링 해요 있도록 HTML을 전환하면 또 다른 이상한 점은 동일한 코드 및 라이브러리를 사용

 Holidays: Backbone.Collection.extend({ 

    inititlaize: function() 
    { 
     this.model = YM.Holidays.Holiday; 
     } 
    }), 

그 어떤 이유로 든 목록을 두 번 렌더링하지만, 나는 정말로 그것을하지 않으려 고하지 않는다. 나는 왜 그 이유를 들여다 보지 않았다.) 예 경우 대신 다음과 같은 마크 업

<div data-role="page" id="Holidays"> 
    <div data-role="header"> 
    <h1>Holidays</h1> 
    </div> 
    <div data-role="content"> 
      <ul data-role="listview" data-inset="true" id="ulHolidays"> 
     </ul> 
    </div> 
    <div data-role="footer"> 
     <h3>Footer</h3> 
    </div> 
    </div> 

위해 나는

<div> 
    <ul data-role="listview" data-inset="true" id="ulHolidays"></ul> 
    </div> 

나는 오류가 발생하지 않습니다까지이 마크 사용 (이 두 번 렌더링하지만,하지만 그 아마 관련이없는 것). 아무도 여기에 무슨 일이 일어나고 있는지에 대한 아이디어 나 통찰력을 가지고 있지 않습니까?

+0

- 아무 문제없이 내가도를 사용하고 있습니다. 이 라이브러리를 사용하는 코드를 올리시겠습니까? 나는 그 오류가 있다는 것을 확신한다. – acme

+0

솔직히 말해서 제 코드를 정확히 어디에서야 잘 모릅니다. 오류를 일으키는 행은'YM.holidays.fetch' (또는 내가 대신 사용하는 어떤 콜렉션)를 호출하는 것입니다. 오류를 재현하고 오류의 원인을 좁힐 수있는 새로운 프로젝트를 만들어 보겠습니다. – Jack

+0

컬렉션의 모델 ('model = new this.model (...) '의'this.model')이 모델 "클래스"인지 확인 했습니까? –

답변

4

는이 작은 변화에 잘 작동 : 내가 밑줄 또는 백본의 최신 버전에서 버그가 없다고 생각 http://jsfiddle.net/hnGAA/1/

+1

고마워, 내 테스트 예제에서 작동하며 실제 프로젝트에서이를 시도 할 것입니다. 모델을 나중에 명시 적으로 설정해야하는 이유가 무엇인지 알고 있습니까? 내가하고 있었던 방식이 문서화에 기반하여 수행되는 방식 인 것 같습니다. 또한 어떤 생각이 밑줄을 넣어 무엇이 바뀌 었는가? 감사합니다 – Jack

+0

나는 당신의 대답에 기초하여 일하는 내 코드를 얻을 수 있었고, 나는 누군가가 어떤 일이 일어 났는지에 대한 통찰력이 있는지를보기 위해 좀 더 오랜 시간 질문을 남겼다. (나는 그 동안 당신을 투표했다.) – Jack

+0

100 % 확실하지는 않지만 여전히 문제를 조사하고 있습니다. 나는 최근에 내가 연구하고있는 프로젝트에서 같은 문제에 부딪쳤다. 나는 그것이 문제의 원인을 파악할 수 있다면 이것을 업데이트 할 것입니다. 콜렉션 정의에서 모델을'Backbone.Model'으로 설정하면 작동하지만, 확장 모델로 설정하면 작동하지 않습니다. 그게 내가 생각하기에 연장의 어딘가에있어. 확장 모델을 사용한 후 콜렉션을 검사하면 콜렉션 모델이 정의되지 않은 것으로 표시됩니다. – ryanmarc

관련 문제