2013-04-29 6 views
0

Этот вопрос связан с ответом here.Ember - как создать и связать контроллер Checkbox?

Имея флажок в представлении

App.RoleCheckbox = Em.Checkbox.extend({ 
    userRolesBinding: 'parentView.user.roles', // Points to the roles of the user 

    checked: function() { 
     var userRoles = this.get('userRoles'); 
     return userRoles.contains(this.get('content')); 
    }.property('content', '[email protected]'), 

    click: function (evt) { 
     //do something 
     var controller = this.get("controller"); 
     controller.clicked(evt); 
    } 
}); 

Я хотел бы, что функция клик вызывает щелкнул функцию из RoleCheckboxController:

App.RoleCheckboxController = Em.Controller.extend({ 
    clicked: function(evt){ 
     //Really do the thing 
    } 
}); 

Но это не работает. Как я могу это исправить?

JSFiddle: http://jsfiddle.net/3fMpD/

ответ

1

Вы можете создать экземпляр и связать контроллер с представлением с помощью правильного naming conventions.

Например, это может связать контроллер с точки зрения:

// Instead of App.RoleCheckBoxController 
App.ApplicationController = Ember.Controller.extend(/* ... */); 
App.ApplicationView = Ember.View.extend(/* .. */); 

JSFiddle: http://jsfiddle.net/YL5rQ/

+0

спасибо, он прояснил мне все. Я отредактировал ваш ответ, чтобы показать часть вашего кода jsfiddle. – lauhub

+0

Другой вопрос: я не понимаю привязки, которые вы используете. Какой документ или учебник я должен прочитать, чтобы лучше понять userRolesBinding, ... вы использовали?Я не могу повторно использовать это как подзаголовок другого приложения – lauhub

+0

Я думаю, что редактирование по какой-то причине не было одобрено. И в моем ответе есть два 'userRolesBinding':' userRolesBinding: 'parentView.user.roles'' (который подробно [здесь] (http://emberjs.com/guides/understanding-ember/the-view-layer/)) и 'userRolesBinding: 'user.roles'', который является простым связыванием. –

0

Ваш App.RoleCheckboxController никогда не создается. То, как вы создали вещи, будет только экземпляром ApplicationController.

Вы можете переместить логику обратно в click событию зрения, чтобы иметь все работы:

App.RoleCheckbox = Em.Checkbox.extend({ 
    userRolesBinding: 'parentView.user.roles', 

    checked: function() { 
     var userRoles = this.get('userRoles'); 
     return userRoles.contains(this.get('content')); 
    }.property('content', '[email protected]'), 

    click: function (evt) { 
     console.log("event triggered:", evt); 
     //var controller = this.get("controller"); 
     //controller.clicked(evt); 
     var isPresent = this.get('checked'), 
      userRoles = this.get('userRoles'), 
      role = this.get('content'); 

     console.log("userRoles = ", userRoles); 
     console.log("role = ", role); 
     console.log("will be: ", isPresent ? "removed" : "added"); 

     if (!isPresent) { 
      userRoles.pushObject(role); 
     } else { 
      userRoles.removeObject(role); 
     } 
    } 
}); 

Updated JSFiddle

+0

На самом деле, то, что вы написали оригинальное решение, которое я имел (см первое звено моего вопроса). Я хотел бы поставить бизнес-логику (часть внутри функции щелчка) в функции контроллера. – lauhub

1

@ C4P, безусловно, правы, и проблема существует в том, что ваш контроллер не создается, и, кроме того, App.RoleCheckbox не знает, что он должен использовать App.RoleCheckboxController в качестве своего контроллера.

Я не совсем уверен, что это самый Ember-й способ сделать это, но вы можете установить контроллер в (функции конструктора) init в представлении Checkbox, а затем убедитесь, что вы send к контроллеру все свойства он должен работать с:

App.RoleCheckbox = Em.Checkbox.extend({ 

    init: function(){ 
     this._super(); 
     this.set('controller', new App.RoleController()); 
    }, 

    userRolesBinding: 'parentView.user.roles', 

    checked: function() { 
     var userRoles = this.get('userRoles'); 
     return userRoles.contains(this.get('content')); 
    }.property('content', '[email protected]'), 

    click: function (evt) { 
     this.get('controller').send('clicked',this.checked, this.content); 
    } 
}); 

и код контроллера (только изменяя параметры, используемые в функции);

App.RoleCheckboxController = Em.ObjectController.extend({ 
    clicked: function(checked,role){ 

     var userRoles = App.User.roles; 

     console.log("userRoles = ", userRoles); 
     console.log("role = ", role); 
     console.log("will be: ", !checked ? "removed" : "added"); 

     if (checked) { 
      userRoles.pushObject(role); 
     } else { 
      userRoles.removeObject(role); 
     } 

     console.log("updated userRoles = ", userRoles); 

    } 
}); 

Работа скрипки здесь: http://jsfiddle.net/cfSwq/3/

Надеется, что это помогает!

+0

Спасибо, это помогло мне в понимании этого. Я не знаю, можно ли повторно использовать существующий экземпляр объекта, что было бы лучшим подходом, но мне кажется, что это хорошо. – lauhub

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