Backbone - 从 DOM 或 Collection 获取用户选择的数据
Backbone - Get user's selected data from DOM or Collection
我有一个BackboneCollection(名为themeCollection
)列出了哪些项目在网页上 (DOM)。用户可以 select 该列表中的一项。我需要将用户的 selected 项目与其他信息一起保存到数据库中。我想到了两种实现此功能的方法。
1) 从 DOM 中获取 selected 列表项(通过 jquery)
addCard: function(e) {
e.preventDefault();
var formData = {};
// Get data from the form
$( '#modal-new-card form' ).children( 'input' ).each( function( i, el ) {
if ( $(el).val() != '' ) {
formData[ el.id ] = $(el).val();
}
$(el).val('');
});
// Get selected listed item from the DOM.
formData['theme'] = this.$el.find('div.colorSelected').attr('color');
// Code for saving into the database
// ...
}
2) 从 Backbone Collection
中获取 selected 列表项
addCard: function(e) {
e.preventDefault();
var formData = {};
$( '#modal-new-card form' ).children( 'input' ).each( function( i, el ) {
if ( $(el).val() != '' ) {
formData[ el.id ] = $(el).val();
}
$(el).val('');
});
formData['theme'] = this.themeCollection.findWhere({selected: true});
}
第一种方式在我看来有点别扭。它触及 DOM,因此它与 DOM 紧密耦合。这不好。每当更改 CSS class
时,我的应用程序就会停止工作。
第二种方法是多做一些工作。每当用户单击时,我必须将 themeModel's
selected 属性更改为 true
。更改时,我还必须将 false
设置为 selected collection.
中所有其他模型的属性
哪种方式更好?如果大家有其他的方法,欢迎分享给我,推荐一下。
看起来你不应该像 Collection 那样存储它。
如果只是选择颜色,最好将其存储为模型属性({"theme": "purple"}
),然后将此模型发送到服务器。
标记:
<input type="radion" name="theme" value="yellow">
<input type="radion" name="theme" value="purple">
您的看法:
function changeTheme() {
var cardData = this.$el.serializeArray(); // jQuery just for brevity
this.model.trigger('THEME_CHANGE', cardData);
}
Backbone.Collection.extend({
tagName: 'form',
events: {
'change [name="theme"]': changeTheme
}
});
模型只监听 THEME_CHANGE
并处理数据。
看来您需要了解更多有关 Backbone 的信息,但我会尽力提供帮助...
您应该使用 Model
来维护表单数据,并通过 View
添加事件以在情况发生变化时更新模型。提交后,您可以调用model.toJSON()
保存到数据库。
var NewCard = Backbone.Model.extend({
defaults: {
question: '',
explanation: '',
color: 'Blue'
}
})
然后设置一个集合来保存颜色 select
var colors = new Backbone.Collection([
{color: 'Blue'},
{color: 'Gray'}
]);
Here is a working example
这个例子还很不完整,但应该给你一张图片。
我有一个BackboneCollection(名为themeCollection
)列出了哪些项目在网页上 (DOM)。用户可以 select 该列表中的一项。我需要将用户的 selected 项目与其他信息一起保存到数据库中。我想到了两种实现此功能的方法。
1) 从 DOM 中获取 selected 列表项(通过 jquery)
addCard: function(e) {
e.preventDefault();
var formData = {};
// Get data from the form
$( '#modal-new-card form' ).children( 'input' ).each( function( i, el ) {
if ( $(el).val() != '' ) {
formData[ el.id ] = $(el).val();
}
$(el).val('');
});
// Get selected listed item from the DOM.
formData['theme'] = this.$el.find('div.colorSelected').attr('color');
// Code for saving into the database
// ...
}
2) 从 Backbone Collection
中获取 selected 列表项addCard: function(e) {
e.preventDefault();
var formData = {};
$( '#modal-new-card form' ).children( 'input' ).each( function( i, el ) {
if ( $(el).val() != '' ) {
formData[ el.id ] = $(el).val();
}
$(el).val('');
});
formData['theme'] = this.themeCollection.findWhere({selected: true});
}
第一种方式在我看来有点别扭。它触及 DOM,因此它与 DOM 紧密耦合。这不好。每当更改 CSS class
时,我的应用程序就会停止工作。
第二种方法是多做一些工作。每当用户单击时,我必须将 themeModel's
selected 属性更改为 true
。更改时,我还必须将 false
设置为 selected collection.
哪种方式更好?如果大家有其他的方法,欢迎分享给我,推荐一下。
看起来你不应该像 Collection 那样存储它。
如果只是选择颜色,最好将其存储为模型属性({"theme": "purple"}
),然后将此模型发送到服务器。
标记:
<input type="radion" name="theme" value="yellow">
<input type="radion" name="theme" value="purple">
您的看法:
function changeTheme() {
var cardData = this.$el.serializeArray(); // jQuery just for brevity
this.model.trigger('THEME_CHANGE', cardData);
}
Backbone.Collection.extend({
tagName: 'form',
events: {
'change [name="theme"]': changeTheme
}
});
模型只监听 THEME_CHANGE
并处理数据。
看来您需要了解更多有关 Backbone 的信息,但我会尽力提供帮助...
您应该使用 Model
来维护表单数据,并通过 View
添加事件以在情况发生变化时更新模型。提交后,您可以调用model.toJSON()
保存到数据库。
var NewCard = Backbone.Model.extend({
defaults: {
question: '',
explanation: '',
color: 'Blue'
}
})
然后设置一个集合来保存颜色 select
var colors = new Backbone.Collection([
{color: 'Blue'},
{color: 'Gray'}
]);
Here is a working example
这个例子还很不完整,但应该给你一张图片。