Emberオブジェクトとチェックボックス間の双方向バインディングを処理する一般的な方法は、サーバーとクライアント上の列挙型を同期させたい場合は、プラグインを必要とせずにプレーンEmber.jsを使用して実装できます手動(AJAXまたはWebSocketを使用)。 Emberは、同期後自動的にチェックボックスを使用してオプションのリストを更新できます。
だから、今後、私はあなたがエンバー配列としての役割を持つ午前列挙型を持っていると仮定します:
App.Roles = [ "USER", "ADMIN", "GUEST" ];
その後、我々はこのようなCollectionViewでユーザーが利用できるオプションが表示されますテンプレートは以下のとおりです( )。
OptionsView = Em.CollectionView.extend({
contentBinding: 'App.Roles', // Show a list of _all_ available roles
userBinding: 'App.User', // This points to the active user
tagName: 'ul', // Shown as a <ul>
itemViewClass: Em.View.extend({
userBinding: 'parentView.user', // For convenience
templateName: 'user-roles' // Defined later
})
});
各オプションのテンプレートは次のとおりです。
<script data-template-name="user-roles" type="text/x-handlebars">
<label> {{view App.RoleCheckbox
contentBinding="view.content"}}
{{view.content}}
</label>
</script>
注<label>
タグの使用は、チェックボックスのclick
イベントは、タグの任意の場所をクリックすることで解雇されたことを確認すること。
最後App.RoleCheckbox
が役割を切り替えchecked
プロパティとclick
イベントを処理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) {
var isPresent = this.get('checked'),
userRoles = this.get('userRoles'),
role = this.get('content');
if (!isPresent) {
userRoles.pushObject(role);
} else {
userRoles.removeObject(role);
}
}
});
本の実施例は次のとおりです。http://jsfiddle.net/BLQBf/(参照するには、コンソールを見てくださいログメッセージ)
ビューは、controller
を意味するジョブの一部であるため、これは完全にEmber-esqueではありません。理想的には、click
イベントはRoleCheckboxController
上の関数を呼び出し、User
オブジェクトを変更します。
答えに@musically_utを感謝します。私はこの実装を延期しなければならなかったので、私のコメントは遅れています。あなたのソリューションは機能しますが、小さな問題がありました。クリックされたイベントの前にオブザーバが 'checked'をトリガします。そこでは、clickイベントによってトリガーされたif-elseステートメントを元に戻す必要がありました。 –
@musically_ut、あなたは[ここ](http://stackoverflow.com/questions/16281401/ember-how-to-create-and-bind-a-)のようにRoleCheckboxControllerを呼び出す方法について質問しました。チェックボックスのコントローラ)、私はそれを動作させることができませんでした。 – lauhub
はすでに@musically_utの回答に対して編集を開始しました。現在、ピアレビューされています。それがレビューされるまで。ブラウザの互換性のため、「クリック」イベントではなく「変更」イベントを使用してください。 https://github.com/emberjs/ember.js/issues/2604も参照してください –