2013-09-27 2 views
12

Я пытаюсь создать компонент модального блока в ember. Модальная коробка имеет две стандартные кнопки: «закрыть» и «сохранить». Я хотел передать действие контроллера этому компоненту, чтобы при нажатии кнопки сохранения он вызывал действие контроллера, которое было передано. Звоню компонент, как:Объект связывания контроллера с компонентом в ember

{{#affi-modal-box title="Test title" modalId="createNewAnalyticsRunModal" controllerBinding=controller}}some message{{/affi-modal-box}} 

и мой компонент:

AS.AffiModalBoxComponent = Ember.Component.extend({ 
attributeBindings: ['modelId','test'], 
    //this is the function that gets called when save button is clicked 
    onSaveButtonClick : function(){ 

     console.log(this.controllerFor('analysisTemplates'));//fails 
     console.log(this.get('controller'));//returns modal box component which I don't need 
    } 

});

Любые идеи, как я могу передать объект контроллера компоненту?

Спасибо.

ответ

26

Способ работы Ember.Component должен быть агностическим для других частей вашего приложения, поэтому вместо этого передается контроллер, на котором вы хотите, чтобы действие вызывалось, когда что-то происходит в вашем компоненте, вы делаете это больше таким образом:

{{#affi-modal-box 
    title="Test title" 
    modalId="createNewAnalyticsRunModal" 
    action="actionNameOnTheController"}}some message{{/affi-modal-box}} 

Как вы можете увидеть, вы установите атрибут имени действия action на контроллере, а затем внутри компонента, просто вызовите this.sendAction('action');, который будет запускать любое имя действия, которое вы определили ранее:

AS.AffiModalBoxComponent = Ember.Component.extend({ 
    attributeBindings: ['modelId','test'], 
    //this is the function that gets called when save button is clicked 
    onSaveButtonClick : function(){ 
    this.sendAction('action'); 
    } 
}); 

Итак, всякий раз, когда вызывается onSaveButtonClick, он отправит действие actionNameOnTheController тому, кто его прослушивает. И лучше всего, ничего не зная о контроллере. Это тот тип функциональности, который делает Ember.Component многократно используемым.

Пожалуйста, ознакомьтесь с приведенной здесь концепцией simple demo.

Надеюсь, это поможет.

+0

Но если вы просто пытаетесь обновить свойство контроллера из компонента, вы просто переназначаете значение этого свойства внутри компонента, а автоматические привязки, передав свойство контроллера в компонент, позаботятся обновления, не так ли? Поэтому для простых изменений свойств контроллера вам не нужно использовать этот основной способ. Является ли это более естественным способом сделать это даже для простых изменений свойств? – ahnbizcad

+2

@ahnbizcad, если вы собираетесь плотно связать компонент с контроллером, вы можете даже не использовать компонент. Назначение компонентов - развязка для повторного использования. Таким образом, компонент построен с действиями, которые действуют как перехватчики. И в зависимости от того, где компонент упал, эти действия могут инициировать различные действия контроллера, чтобы сделать то, что наиболее полезно в этом контексте. Это имеет смысл? – Misterparker

+0

@intuitivepixel можно передать параметры с помощью этого решения? – murli2308

Смежные вопросы