将 Backbone 模型属性绑定到 TinyMCE 文本
Bind a Backbone Model attribute to a TinyMCE text
我正在制作一个包含富文本的表单。为此,我有 TinyMCE,Backbone 控制逻辑,下划线用于模板。
我找不到是否有办法将 Backbone 模型绑定到 TinyMCE 值?
类似于:
var backboneModel = new BackBobeModel();
tinymce.init({
selector:'#rich-text',
'data-object': backboneModel.richText
});
据我所知,TinyMCE 不会自动绑定 Backbone。所以我制作了一个简单的可重用 TextArea
组件。
它由 Backbone 视图创建,该视图将自己的根 <textarea>
元素初始化为 TinyMCE 实例,并将自身绑定到其 Change
事件中。
TinyMCE Backbone 组件
var TextArea = Backbone.View.extend({
tagName: 'textarea',
initialize: function(options) {
// set the default options
options = this.options = _.extend({
attribute: 'value',
format: 'raw'
}, options);
// initialize a default model if not provided
if (!this.model) this.model = new Backbone.Model();
if (!this.getValue()) this.setValue('');
this.listenTo(this.model, 'change:' + options.attribute, this.onModelChange);
},
render: function() {
this.$el.html(this.getValue());
tinymce.init({
target: this.el,
init_instance_callback: this.onEditorInit.bind(this)
});
return this;
},
// simple accessors
getValue: function() {
return this.model.get(this.options.attribute) || '';
},
setValue: function(value, options) {
return this.model.set(this.options.attribute, value, options);
},
// event handlers
onEditorInit: function(editor) {
editor.on('Change', this.onTextChange.bind(this));
this.editor = editor;
},
onTextChange: function(e) {
this.setValue(this.editor.getContent());
},
onModelChange: function(model, value, options) {
if (!this.editor) return;
this.editor.setContent(value, { format: this.options.format });
}
});
按原样使用
您可以在没有模型的情况下使用它,它会创建自己的模型来跟踪数据。
var component = new TextArea({ content: "initial content" });
可以检索数据甚至收听组件的模型。
component.getValue();
// or use events:
Backbone.listenTo(component.model, 'change:value', function(model, value, options) {
// use the new value
});
与自定义模型一起使用
假设您有一个具有任意属性的自定义模型。
var car = new CarModel({
make: "mazda",
description: "This is a car"
// ...
});
只需将它传递给组件,定义它应该使用哪个属性来更新模型。
var component = new TextArea({
model: car,
//
attribute: 'description'
});
相同的初始模型实例 description
属性现在将在用户在 TinyMCE 框中键入时自动更新。
Backbone.listenTo(car , 'change:description', function(model, value, options) {
console.log("Car description changed:", value);
});
我正在制作一个包含富文本的表单。为此,我有 TinyMCE,Backbone 控制逻辑,下划线用于模板。
我找不到是否有办法将 Backbone 模型绑定到 TinyMCE 值?
类似于:
var backboneModel = new BackBobeModel();
tinymce.init({
selector:'#rich-text',
'data-object': backboneModel.richText
});
据我所知,TinyMCE 不会自动绑定 Backbone。所以我制作了一个简单的可重用 TextArea
组件。
它由 Backbone 视图创建,该视图将自己的根 <textarea>
元素初始化为 TinyMCE 实例,并将自身绑定到其 Change
事件中。
TinyMCE Backbone 组件
var TextArea = Backbone.View.extend({
tagName: 'textarea',
initialize: function(options) {
// set the default options
options = this.options = _.extend({
attribute: 'value',
format: 'raw'
}, options);
// initialize a default model if not provided
if (!this.model) this.model = new Backbone.Model();
if (!this.getValue()) this.setValue('');
this.listenTo(this.model, 'change:' + options.attribute, this.onModelChange);
},
render: function() {
this.$el.html(this.getValue());
tinymce.init({
target: this.el,
init_instance_callback: this.onEditorInit.bind(this)
});
return this;
},
// simple accessors
getValue: function() {
return this.model.get(this.options.attribute) || '';
},
setValue: function(value, options) {
return this.model.set(this.options.attribute, value, options);
},
// event handlers
onEditorInit: function(editor) {
editor.on('Change', this.onTextChange.bind(this));
this.editor = editor;
},
onTextChange: function(e) {
this.setValue(this.editor.getContent());
},
onModelChange: function(model, value, options) {
if (!this.editor) return;
this.editor.setContent(value, { format: this.options.format });
}
});
按原样使用
您可以在没有模型的情况下使用它,它会创建自己的模型来跟踪数据。
var component = new TextArea({ content: "initial content" });
可以检索数据甚至收听组件的模型。
component.getValue();
// or use events:
Backbone.listenTo(component.model, 'change:value', function(model, value, options) {
// use the new value
});
与自定义模型一起使用
假设您有一个具有任意属性的自定义模型。
var car = new CarModel({
make: "mazda",
description: "This is a car"
// ...
});
只需将它传递给组件,定义它应该使用哪个属性来更新模型。
var component = new TextArea({
model: car,
//
attribute: 'description'
});
相同的初始模型实例 description
属性现在将在用户在 TinyMCE 框中键入时自动更新。
Backbone.listenTo(car , 'change:description', function(model, value, options) {
console.log("Car description changed:", value);
});