欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

對JavaScript客戶端應(yīng)用編程的一些建議

 更新時間:2015年06月24日 12:02:53   投稿:goldensun  
這篇文章主要介紹了對JavaScript客戶端應(yīng)用編程的一些建議,主要針對MVC框架框架的一些相關(guān)使用問題,需要的朋友可以參考下

你可能注意到了,最近的一段時間越來越多的Web應(yīng)用有變復雜的趨勢,重心從服務(wù)端慢慢向著客戶端轉(zhuǎn)移。 這是個正常的趨勢么?我不知道。支持和反對者的討論就像是在討論復活者和圣誕節(jié)哪一個更好一樣; 很難說哪一方觀點就是完全正確的。因此,本文不會探討究竟哪一方是對的,不過我還是試圖解釋一下使用大家所熟知的面向?qū)ο缶幊桃苍S可以成功的解決客戶端編程中存在的一些問題。

不太規(guī)范的代碼的示例

為了顧及一個應(yīng)用的響應(yīng)以及用戶體驗, 導致我們創(chuàng)建了持續(xù)增長的復雜的代碼, 這些代碼變得難于理解和維護。 你可以輕松的想到在沒有任何構(gòu)架和遵循規(guī)則構(gòu)建出客戶端的JavaScript應(yīng)用代碼將會這樣:
 

$(function(){
  $('#form').submit(function(e) {
    e.preventDefault();
 
    $.ajax({
      url: '/animals',
      type: 'POST',
      dataType: 'json',
      data: { text: $('#new-animal').find('textarea').val() },
      success: function(data) {
        $('#animals').append('<li>' + data.text + '</li>');
        $('#new-animal').find('textarea').val('');
      }
     });
   });
});

維護這一類的代碼將會很難。因為這短短的一段代碼與很多地方都有關(guān)聯(lián): 它控制著很多的事件 (站點, 用戶, 網(wǎng)絡(luò)事件), 它要處理用戶的操作事件, 要解析服務(wù)器返回的應(yīng)答并且產(chǎn)生HTML代碼。 有人可能說: “是的,你說的對, 但是如果這不是一個客戶端單頁的頁面應(yīng)用?這最多算是一次過度使用jQuery類庫的例子” ——不是很有說服力的觀點, 因為眾所周知,易于維護和精心設(shè)計的代碼是非常重要的。特別是許多的工具或者是框架致力于保持代碼可用以便于我們能更簡單的去測試、維護、重用、和擴展它。

MVC是什么?

談到這里。我們能受益于那些基于MVC的JavaScript框架,但這些框架大部分不使用MVC,并且相當于Model和Videw的一種結(jié)合,或者在二都之間的一些東西,這很難去分清。這就是為什么說大部分的Javascript框架是基于MV*。

改變方法或許可以提供項目中客戶端的組織和架構(gòu),這使得代碼可以在很長的一段時間內(nèi)容易維護,即使重構(gòu)已經(jīng)有的代碼也變得相對容易。知道他如何工作和下面一些問題的答案是必需要要記住的。

  •     我的應(yīng)用里有哪些類型的數(shù)據(jù)?-Model
  •     用戶應(yīng)該看到什么?-View
  •     誰是和用戶交互的程序?-Controller

使用MVC框架重構(gòu)代碼

受用MVC重構(gòu)代碼有什么好處?

  •     解除DOM和Ajax的依賴
  •     代碼有更好的結(jié)構(gòu),并且更容易測試。
  •     從 $(document).ready()中刪除多余的代碼,只留下使用Model創(chuàng)建Links的部分。

讓我們使用一些簡單步驟來重構(gòu)一個典型的代碼塊
步驟 1: 創(chuàng)建視圖并移動Ajax請求

我們開始解除DOM和Ajax的依賴. 使用prototypes建造者,模式創(chuàng)建'Animals' 對象,并且添加一個 'add' 方法.同時創(chuàng)建視圖 'NewAnimalView' , 并且添加方法'addAnimal'、 'appendAnimal' 、'clearInput'.

代碼如下:
 

var Animals = function() {
};
 
Animals.prototype.add = function (options) {
   $.ajax({
     url: '/animals',
     type: 'POST',
     dataType: 'json',
     data: { text: options.text },
     success: options.success
   });
};
 
 var NewAnimalView = function (options) {
  this.animals = options.animals;
  var add = $.proxy(this.addAnimal, this);
  $('# form').submit(add);
 };
 
 NewAnimalView.prototype.addAnimal = function(e) {
   e.preventDefault();
   var self = this;
 
   this.animals.add({
     text: $('#new-animal textarea').val(),
     success: function(data) {
       self.appendAnimal (data.text);
       self.clearInput();     
     }
   });
 };
 
NewAnimalView.prototype.appendAnimal = function(text) {
  $('#animals ul').append('<li>' + data.text + '</li>');
};
NewAnimalView.prototype.clearInput = function() {
  $('#new-animal textarea').val('');
};
 
 $(document).ready(function() {
   var animals = new Animals();
   new NewAnimalView({ animals: animals });
 });

步驟 2: 使用事件解除依賴.

這個例子,利用MVC框架是關(guān)鍵。我們將會用到事件機制, 事件使我們結(jié)合和觸發(fā)自定義事件. 因此,我們創(chuàng)建新的“AnimalsView”和“NewAnimalView”,并且賦予它們不同的顯示animals的職責。 使用事件就來區(qū)別職責非常簡單。如果在方法和事件之間傳遞職責,如下所示:
 

var events = _.clone(Backbone.Events);
var Animals = function() {
};
 
Animals.prototype.add = function(text) {
   $.ajax({
     url: '/animals',
     type: 'POST',
     dataType: 'json',
     data: { text: text },
     success: function(data) {
      events.trigger('animal:add', data.text);
     }
   });
};
 
var NewAnimalView = function(options) {
  this.animals = options.animals;
  events.on('animal:add', this.clearAnimal, this);
  var add = $.proxy(this.addAnimal, this);
  $('# form').submit(add);
 };
 
NewAnimalView.prototype.addAnimal = function(e) {
   e.preventDefault();
   this.animals.add($('#new-animal textarea').val());
 };
 
NewAnimalView.prototype.clearInput = function() {
  $('#new-animal textarea').val('');
};
 
var AnimalsView = function() {
  events.on('animal:add', this.appendAnimal, this);
};
 
AnimalsView.prototype.appendAnimal = function(text) {
  $('#animals ul').append('<li>' + data.text + '</li>');
};
 
$(document).ready(function() {
   var animals = new Animals();
   new NewAnimalView({ animals: animals });
   new AnimalsView();
});

步驟 3: 傳遞數(shù)據(jù)結(jié)構(gòu)到核心框架

最后,最重要的一步,我們使用: models, views and collections.
 

var Animal = Backbone.Model.extend({
  url: '/animals'
});
 
var Animals = Backbone.Collection.extend({
  model: Animal
});
 
var AnimalsView = Backbone.View.extend({
  initialize: function() {
    this.collection.on('add', this.appendAnimal, this);
  },
 
  appendAnimal: function(animal) {
    this.$('ul').append('<li>' + animal.escape('text') + '</li>');
  }
});
 
 
var NewAnimalView = Backbone.View.extend({
  events: {
    'submit form': 'addAnimal'
  },
 
  initialize: function() {
    this.collection.on('add', this.clearInput, this);
  },
 
  addAnimal: function(e) {
    e.preventDefault();
    this.collection.create({ text: this.$('textarea').val() });
  },
 
  clearInput: function() {
    this.$('textarea').val('');
  }
});
 
$(document).ready(function() {
  var animals = new Animals();
  new NewAnimalView({ el: $('#new-animal'), collection: animals });
  new AnimalsView({ el: $('#animals'), collection: animals });
});

總結(jié)

我們已經(jīng)實現(xiàn)什么呢?我們在高度的抽象上工作。代碼的維護、重構(gòu)和擴展變得更容易。我們極大的優(yōu)化了代碼結(jié)果,是不是很迷人?太棒了。但是,我可能要給你潑冷水,即使最好的框架,開發(fā)的代碼仍舊是脆弱并且難以維護。因此,如果你認為使用了一個較好的MV*框架能解決所有代碼上的問題是錯誤的。記住在重構(gòu)過程中,經(jīng)歷了第二步,代碼會變得好很多,我們不使用框架的主要組件。

記住MV*框架是好的這一點,但是所有關(guān)注在‘How'去開發(fā)一個應(yīng)用,這讓程序開發(fā)人員頭決定‘What'。每個框架的一個補充,尤其是當項目的Domain很復雜,將是Domain驅(qū)動設(shè)計方法,這將更關(guān)注與下面的方面:“what”, 把需求轉(zhuǎn)化為真正的產(chǎn)品的一個過程。但是,這是我們要討論的另外一個主題。

相關(guān)文章

  • 學習js在線html(富文本,所見即所得)編輯器

    學習js在線html(富文本,所見即所得)編輯器

    需要一個可以編輯同時又可顯效果的編輯框。textarea不行,它只能用來輸入純文本,不能顯示顏色、斜體之類的文字樣式,就像記事本,本文介紹所見即所得編輯器實現(xiàn)原理
    2012-12-12
  • 深入理解javascript作用域和閉包

    深入理解javascript作用域和閉包

    作用域和作用域鏈是javascript中非常重要的特性,對于他們的理解直接關(guān)系到對于整個javascript體系的理解,而閉包又是對作用域的延伸,也是在實際開發(fā)中經(jīng)常使用的一個特性,實際上,不僅僅是javascript,在很多語言中都提供了閉包的特性。
    2014-09-09
  • 簡介JavaScript中search()方法的使用

    簡介JavaScript中search()方法的使用

    這篇文章主要介紹了簡介JavaScript中search()方法的使用,是JS入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06
  • javascript學習筆記(四) Number 數(shù)字類型

    javascript學習筆記(四) Number 數(shù)字類型

    數(shù)字格式化方法toFixed()、toExponential()、toPrecision(),三個方法都四舍五入
    2012-06-06
  • javascript知識點收藏

    javascript知識點收藏

    javascript知識點收藏...
    2007-02-02
  • 代碼獲取歷史上的今天發(fā)生的事

    代碼獲取歷史上的今天發(fā)生的事

    這篇文章主要介紹了代碼獲取歷史上的今天發(fā)生的事,數(shù)據(jù)來源于wiki,需要的朋友可以參考下
    2014-04-04
  • javascript深拷貝的幾種情況總結(jié)

    javascript深拷貝的幾種情況總結(jié)

    這篇文章主要為大家介紹了javascript深拷貝的幾種情況,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • JavaScript中BOM和DOM詳解

    JavaScript中BOM和DOM詳解

    本文主要講解了JavaScript中BOM和DOM,BOM為瀏覽器對象模型,DOM 為文檔對象模型,兩者之間有很大的區(qū)別,感興趣的小伙伴可以閱讀一下這篇文章,了解相關(guān)內(nèi)容
    2021-08-08
  • 詳解javascript void(0)

    詳解javascript void(0)

    這篇文章主要介紹了javascript void關(guān)鍵字的相關(guān)資料,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • arguments對象

    arguments對象

    arguments對象...
    2006-11-11

最新評論