2014-01-09 23 views
1

我正在處理一個應用程序,並且有幾個方法Angular沒有提供我覺得有用的東西。我創建了一個文件來用所需的方法擴展Angular,而不是創建一個實用程序服務並注入它(這對於簡單的jQuery-esque方法來說似乎很麻煩)。使用其他方法擴展Angular不好嗎?

所以,我堅持我的頭,問這是否是一個好主意?有沒有理由避免這種做法?

例如angular.extensions.js

// Angular has been previously loaded 

;(function() { 

    angular.extend(angular, { 

    isEmptyObject: function(obj) { 
     var name; 
     for (name in obj) { 
     return false; 
     } 
     return true; 
    } 

    // etc. for simple helpers 

    }) 

})(); 
+2

'return Object.keys(obj).length == 0;' – zerkms

+0

@zerkms'jQuery'的'$ .isEmptyObject'函數使用類似於問題代碼的東西。不知道爲什麼,或許這是長度的誤判,或者這是一種表演。但他們可能有一個很好的迭代形式的理由。 –

+0

不錯,我偷了我的例子從jQuery 2.0.3。我們能夠在我們的應用程序中支持ES5,所以@ zerkms的例子是一個改進。我想,jQuery沒有使用Object.keys的優點,或者不得不通過一些ES5功能檢測來擴展他們的方法。 – BradGreens

回答

5

我想這在技術上是好的,但可能有點忌諱風格明智的。考慮一位加入你的團隊的新開發人員,並在你的代碼庫中看到angular.generatePuppy()。他搜索了angular.generatePuppy(),並且在Angular API中找不到任何文檔或引用,並且隨之產生挫折感,儘管由於小狗的谷歌搜索結果而略微減少。如果你已經創建了一個實用程序服務,它可以很容易地將它注入任何你可能需要它的地方。一旦你安裝了它,這不是額外的工作,並且在我看來,將使代碼更具可讀性,因爲在你寫的內容和Angular提供的內容之間有明確的界限。

+2

有趣的*角*。我確實試圖與現有的,簡單的實用方法保持一致,並且不會在角度空間中添加模糊的功能。但是有道理的是,角度API旨在提供並正式支持什麼是誤導。 – BradGreens

+1

「角度」...我看到你在那裏做了什麼。 –

2

只要不覆蓋現有屬性,這在技術上很可能很好。但在組織上,這似乎是一個壞主意?

爲什麼不讓自己的全局對象名爲utils呢?

window.utils = { 
    isEmptyObject: function(obj) { ... } 
}; 

一般來說,除非你絕對必須,否則不要弄亂供應商庫。即使現在很好,未來的版本可能會使用該屬性或以不同的方式工作。

從維護性的角度來看,未來的程序員可能會認爲angular.isPlainObject是角框架的一部分。並且在調試某些東西時不會考慮檢查該代碼是否真正起作用。他們可能不知道你的項目實現了它自己的版本,因爲它是在供應商庫上命名的。


總之,你可能可以,它可能會很好。但你真的不應該。

+0

從組織的角度來看,我希望我的方法能夠接近Angular的'isDefined','isObject'等等。但是這裏有很多關於我的例子有問題的要點。 – BradGreens

+0

便利性與可維護性是一個持續的平衡行爲。世界上的一切都很方便,但不可維護。一切深深地嵌套在命名空間中的東西是可維護的,但不方便。如果這種平衡可能會很難找到。 –