2012-01-06 54 views
1

可以说我有一个男孩和女孩的名字的名单。这个名称集合还具有“性别”属性。Backbone.js:视图或集合可以具有属性吗?

我想在集合或视图上放置一个'SelectedGender'属性,以便只有在所选性别更改时才能触发自定义事件。

视图可以扩展为具有触发更改事件的属性吗?

一个Collection是否可以扩展为具有触发change事件的属性?

或者我不得不创建另一个包含集合的模型?我实际上没有代码,我现在只是在考虑设计。

回答

4

回答你的问题:可以扩展一个视图或集合,使其具有引发更改事件的属性,答案是否定的,是的。

不,你不能做view.set({attr: value})collection.set({attr: value})

可以,但是必须通过扩展Backbone.Events视图或收集火灾事件。

YourView = Backbone.View.extend({}); 
_.extend(YourView, Backbone.Events); 

var view = new YourView(); 
view.bind('SelectedGenderChanged', function() { 
    console.log('SelectedGenderChanged event fired!'); 
}); 

//somewhere else in your code 
view.trigger('SelectedGenderChanged'); 

但是,可能有更好的方法来设计它。

如果在用户从组合框中进行选择时选定的性别会发生变化,那么您可以在视图中订阅组合框更改事件,然后让您的视图进行当时需要完成的任何更改。

+0

感谢。看起来我真正需要做的是为我的集合创建Wrapper模型,然后我可以将属性放在这些模型上。 – ctrlShiftBryan 2012-01-06 15:24:55

1

我不认为你需要为你的集合创建包装模型。只需创建一个存储名称和性别的模型。然后,像@Paul提到的那样,您可以订阅集合中或视图中的更改事件。

var nameModel = Backbone.Model.extend({ 
    defaults : function() { 
    return { 
     name : "Andy", 
     gender : "male" 
    }; 
    } 
}); 

var nameCollection = Backbone.Collection.extend({ 
    initialize : function (args) { 
    var self = this; 
    self.model.bind("change:gender", function() { 
     self.changeGender(self.model.get("gender")); 
    }); 
    }, 

    changeGender : function(gender) { 
    // modify your collection somehow 
    } 
}); 

var nameView = Backbone.View.extend({ 
    initialize : function(args) { 
    var self = this; 
    self.model.bind("change:gender", function() { 
     self.changeGender(self.model.get("gender")); 
    }); 
    // in case you have a checkbox or something you want to bind the model change to: 
    self.$(".genderCheckbox").bind("change", function(ev) { 
     self.model.set({ gender, self.$(".genderCheckbox").val() }); 
    }); 
    }, 

    changeGender : function(gender) { 
    // Modify your view here 
    } 
}); 

编辑

而不是具有取决于名字的性别2点独立的集合,为什么没有与该返回刚才那个男孩的名字,并返回一个方法的方法名的一个集合只是女孩的名字?

即:

getMaleNames : function() { 
    return this.filter(function(name) { 
    return name.get('gender') == "male"; 
    }); 
} 
+0

我并没有真正改变个人模特的性别。在你的例子中,安迪永远是男性。我可能会将选择框更改为Andrea,一位女性。我正在寻找的答案是“添加一个属性,将事件更改引发到一个集合中,您必须将它包装在模型中。”我可以创建另一个模型,并在视图上使用2个模型,但包装收藏最适合我。 – ctrlShiftBryan 2012-01-06 16:06:16

+0

在此示例中,默认模型将为男性,但只要您想要更改性别,就可以通过发布model.set({gender:“female”})轻松完成此操作。视图和集合都可以访问模型。 查看活动中的自我$(“。genderCheckbox”)。在你的例子中,这会将模型上的性别属性设置为女性,并且属性更改会触发将调用collection.changeGender和view.changeGender的更改事件。那有意义吗? – stinkycheeseman 2012-01-06 16:29:16

相关问题