当我的收藏被提取时,服务器会向我发送last_name、first_name和Spear_first_name(以及对问题不重要的其他属性)。
我希望能够添加一个名为mailing_name的属性,该属性本质上是:
var setNameOnFormAttribute = this.get("last_name") + ", " + this.get("last_name");
if (!_.isNull(this.get("spouse_first_name")) || !_.isEmpty(this.get("spouse_first_name"))) {
setNameOnFormAttribute += " & " + this.get("spouse_first_name");
}
我想确保如果任何基本属性(last_name、first_name和Spear_first_name)由于任何原因发生更改,自定义mailing_name属性会更新,并且使用mailing_name属性的任何视图都会更新。
如果这有所作为,我正在使用backbone.marionette。
编辑 1
我的第一次尝试:
define([
'backbone'
],
function( Backbone ) {
'use strict';
/* Return a model class definition */
return Backbone.Model.extend({
initialize: function (){
console.log(this.attributes);
this.bind("change:last_name", this.setNameOnFormAttribute);
this.bind("change:first_name", this.setNameOnFormAttribute);
this.bind("change:spouse_first_name", this.setNameOnFormAttribute);
},
setNameOnFormAttribute: function(){
var name_on_form = this.get("last_name") + ", " + this.get("first_name");
if (!_.isNull(this.get("spouse_first_name")) || !_.isEmpty(this.get("spouse_first_name"))) {
name_on_form += " & " + this.get("spouse_first_name");
}
this.set("name_on_form", name_on_form);
}
});
});
如果 ind 奇怪的是,初始化函数开头的 console.log 显示所有属性都已设置。因此属性上的更改事件不会触发,因此我无法注入新属性。
我可能在这里采取了错误的方法......
编辑 2 以回答 Bernardo 的问题
它与木偶视图相连。集合是从复合视图中获取的,集合只是定义了适当的模型。
define([
'backbone',
'collections/tasks',
'views/item/task',
'views/item/tasklist_empty',
'hbs!tmpl/layout/tasklist_tmpl'
],
function( Backbone, TasksCollection, TaskView, tasklistEmptyView, TasklistTmpl ) {
'use strict';
return Backbone.Marionette.CompositeView.extend({
initialize: function() {
this.collection = new TasksCollection();
this.collection.bind("reset", _.bind(this.render, this));
this.collection.fetch({ reset: true });
},
itemView: TaskView,
emptyView: tasklistEmptyView,
template: TasklistTmpl,
itemViewContainer: ".tasks"
});
});
define([
'backbone',
'moment',
'application',
'models/task'
],
function( Backbone, moment, App, Task ) {
'use strict';
/* Return a collection class definition */
return Backbone.Collection.extend({
initialize: function() {
},
comparator: function(model) {
return moment(model.get('received_date')).unix();
},
model: Task,
url: App.apiUrl + '/tasks'
});
});