步骤 2: 使用事件解除依赖.
这个例子,利用MVC框架是关键。我们将会用到事件机制, 事件使我们结合和触发自定义事件. 因此,我们创建新的“AnimalsView”和“NewAnimalView”,并且赋予它们不同的显示animals的职责。 使用事件就来区别职责非常简单。如果在方法和事件之间传递职责,如下所示: 01 | var events = _.clone(Backbone.Events); |
02 | var Animals = function () { |
05 | Animals.prototype.add = function (text) { |
11 | success: function (data) { |
12 | events.trigger( 'animal:add' , data.text); |
17 | var NewAnimalView = function (options) { |
18 | this .animals = options.animals; |
19 | events.on( 'animal:add' , this .clearAnimal, this ); |
20 | var add = $.proxy( this .addAnimal, this ); |
21 | $( '# form' ).submit(add); |
24 | NewAnimalView.prototype.addAnimal = function (e) { |
26 | this .animals.add($( '#new-animal textarea' ).val()); |
29 | NewAnimalView.prototype.clearInput = function () { |
30 | $( '#new-animal textarea' ).val( '' ); |
33 | var AnimalsView = function () { |
34 | events.on( 'animal:add' , this .appendAnimal, this ); |
37 | AnimalsView.prototype.appendAnimal = function (text) { |
38 | $( '#animals ul' ).append( '<li>' + data.text + '</li>' ); |
41 | $(document).ready( function () { |
42 | var animals = new Animals(); |
43 | new NewAnimalView({ animals: animals }); |
步骤 3: 传递数据结构到核心框架
最后,最重要的一步,我们使用: models, views and collections. 01 | var Animal = Backbone.Model.extend({ |
05 | var Animals = Backbone.Collection.extend({ |
09 | var AnimalsView = Backbone.View.extend({ |
10 | initialize: function () { |
11 | this .collection.on( 'add' , this .appendAnimal, this ); |
14 | appendAnimal: function (animal) { |
15 | this .$( 'ul' ).append( '<li>' + animal.escape( 'text' ) + '</li>' ); |
20 | var NewAnimalView = Backbone.View.extend({ |
22 | 'submit form' : 'addAnimal' |
25 | initialize: function () { |
26 | this .collection.on( 'add' , this .clearInput, this ); |
29 | addAnimal: function (e) { |
31 | this .collection.create({ text: this .$( 'textarea' ).val() }); |
34 | clearInput: function () { |
35 | this .$( 'textarea' ).val( '' ); |
39 | $(document).ready( function () { |
40 | var animals = new Animals(); |
41 | new NewAnimalView({ el: $( '#new-animal' ), collection: animals }); |
42 | new AnimalsView({ el: $( '#animals' ), collection: animals }); |
总结 我们已经实现什么呢?我们在高度的抽象上工作。代码的维护、重构和扩展变得更容易。我们极大的优化了代码结果,是不是很迷人?太棒了。但是,我可能要给你泼冷水,即使最好的框架,开发的代码仍旧是脆弱并且难以维护。因此,如果你认为使用了一个较好的MV*框架能解决所有代码上的问题是错误的。记住在重构过程中,经历了第二步,代码会变得好很多,我们不使用框架的主要组件。
记住MV*框架是好的这一点,但是所有关注在‘How’去开发一个应用,这让程序开发人员头决定‘What’。每个框架的一个补充,尤其是当项目的Domain很复杂,将是Domain驱动设计方法,这将更关注与下面的方面:“what”, 把需求转化为真正的产品的一个过程。但是,这是我们要讨论的另外一个主题。 |