나는 이것이 사소한 경우에 쉽게 할 수 있다는 것을 알고 있지만 특정 {{outlet}}
하위 뷰에 사용되는 컨트롤러 및 하위 템플릿을 변경하는 기능을 추가 하여 기본 복원 지점에 혼란 스러웠습니다.
여기 에 jsbin 에 대한 작업 예제가 있습니다 . 문제의 화면으로 바로 이동 하려면 이 링크를 사용하십시오 .
문제는 activites\new
경로에서 발생 합니다. 보기를 텍스트로 시작하고 싶습니다.
활동을 계속 편집하려면 템플릿을 선택하십시오.
처음 렌더링 될 때. 그러나이 텍스트를 표시하려면 하나의 템플릿을 선택한 다음 선택 항목을 프롬프트로 되돌려 야합니다 - Select Template -
.
선택 변경 템플릿 렌더링 작업을 수행하는 관련 개체입니다.
// NewActivityController extends EditActivityController, so this observable
// is re-used without being shared
App.EditActivityController = Ember.ObjectController.extend({
activityTypeDidChange: function() {
var selectedType = this.get('activityType');
console.log("EditActivityController ActivityTypeDidChange: "
+ (selectedType && selectedType.get('key') || 'null'));
this.send('changeType', selectedType);
}.observes('model.activityType')
});
// The controller dispatches an event to trigger the action in the route
App.NewActivityRoute = App.AuthenticatedRoute.extend({
renderTemplate: function() {
this.render('edit_activity', {
controller: 'new_activity'
});
// This doesn't work for setting the initial sub-render
//var type = model.get('activityType');
//if(type) {
//this.render("Edit"+type.key, {into: 'index'});
//} else {
//this.render("NoActivityType", {into: 'index'});
//}
},
model: function() {
return App.Activity.create({
title: "please enter a title",
subjectCode: "please enter a subject code",
activityCode: "please enter an activity code",
activityType: null
});
},
actions: {
changeType: function(selection) {
console.log("NewActivityRoute ChangeType called: "
+ (selection && selection.get('key') || 'null'));
if(selection) {
this.render("Edit"+selection.get('key'),
{outlet: 'edit', into: 'edit_activity'});
} else {
this.render("NoActivityType",
{outlet: 'edit', into: 'edit_activity'});
}
}
}
});
의견이 말했듯이 초기 렌더링에서 모델을 가져올 수 없습니다. model.get
줄만 주석 해제하더라도 컨트롤러와 경로 간의 이벤트 디스패치가 중단됩니다.
콘솔을 열면 모델이 로 초기화 될 때 EditActivityController
의 ActivityTypeDidChange
옵저버가 실행 되는 것을 볼 수 있습니다 . 이것은 이벤트를 전달 하지만 실제로는으로 버블 링 되므로 에서 적절한 하위 뷰를 렌더링하기 위해 처리 할 수 없습니다.activityType
null
changeType
ApplicationRoute
NewActivityRoute
글쎄, 나는 Route.renderTemplate
후크에 대한 근본적인 오해를 가지고 있었다 . model
메소드에서 정의 될 것으로 기대할 수 없으며 매개 변수로 지정해야합니다.
renderTemplate
( 컨트롤러 , 모델 ) packages / ember-routing / lib / system / route.js : 1148에
정의 됨현재 경로에 대한 템플릿을 렌더링하는 데 사용할 수있는 후크입니다.
이 메서드는 현재 경로에 대한 컨트롤러와 함께 호출되고
model
모델 후크에 의해 제공됩니다. 기본적으로 경로에controller
대해로 구성된 경로의 템플릿을 렌더링 합니다.
명확성을 위해 함수 선언에서 굵게 표시된 매개 변수. 내 renderTemplate
코드 후크에 매개 변수를 추가하면 처음에 예상했던대로 정확하게 작동합니다.
renderTemplate: function(controller, model) {
this.render('edit_activity', {
controller: 'new_activity'
});
var type = model.get('activityType');
if(type) {
this.render("Edit"+type.key,
{outlet: 'edit', into: 'edit_activity'});
} else {
this.render("NoActivityType",
{outlet: 'edit', into: 'edit_activity'});
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다