【发布时间】:2014-06-16 05:04:35
【问题描述】:
我有以下代码:
(function(ng,app){
'use strict';
//SERVICE NÀY CUNG CẤP THÔNG TIN VỀ ROUTE REQUEST HIỆN HÀNH
app.service("requestContext",
function (RenderContext) {
// ---------------------------------------------- //
// ---------------------------------------------- //
// Lưu trữ action path hiện hành
var action = "";
// Lưu trữ các action như là một mảng gồm các phần tử vì vậy chúng ta
//có thể dễ dàng kiểm tra các các phần tử của mảng này khi cần
var sections = [];
// Lưu trữ các đối tượng route param hiện hành
var params = {};
// Lưu trữ các action trước đó và các route param, chúng ta sẽ dùng chúng
//để làm một so sánh khi một route thay đổi thành route khác
var previousAction = "";
var previousParams = {};
// ---------------------------------------------- //
function startWith()//XÁC ĐỊNH ACTION HIỆN HÀNH PHẢI BẮT ĐẦU VỚI PATH XÁC ĐỊNH TRƯỚC ĐÓ
{
// Lúc kiểm tra, chúng ta muốn chắc rằng không có thành phần section nào
//không phù hợp sẽ có khả năng gây ra lỗi.Vì vậy một là nó phù hợp với toàn
//bộ, hai là phải bổ sung '.' vào phía cuối
if(!prefix.length||(action===prefix)||(action.indexOf(prefix+".")===0))
{
return(true);
}
return(false);
}
// ---------------------------------------------- //
function getAction()//NHẬN ACTION HIỆN HÀNH
{
return action;
}
function getNextSection()//NHẬN CÁC SECTION KẾ TIẾP DỰA VÀO LOCATION TRÊN ACTION PATH
{
// Hãy chắc chắn rằng tiền tố prefix có tồn tại trong action hiện hành
if(!startWith(prefix)){
return(null);
}
// Nếu tiền tố prefix rỗng thì trả về section đầu tiên
if (prefix === "") {
return (sections[0]);
}
// Ở trên chúng ta đã xác định prefix là hợp lệ, cho phép tìm hiểu độ sâu của
//path hiện tại
var depth = prefix.split(".").length;
// Nếu độ sâu vượt quá gới hạn , nghĩa là action hiện tại không khai báo các section
//mới cho path, trả về null
if (depth === sections.length) {
return (null);
}
//Trả về section sau khi vượt qua các điều kiện
return (sections[depth]);
}
function getParam(name,defaultValue) {// TRẢ VỀ PARAM VỚI TÊN XÁC ĐỊNH,HOẶC DEFAULT VALUE
//HOẶC NULL
if (ng.isUndefined(defaultValue)) {
defaultValue = null;
}
return (params[name] || defaultValue);
}
function getParamAsInt(name, defaultValue) {//TRẢ VỀ PARAM NHƯ MỘT KIỂU INT.NẾU PARAM KHÔNG
//THỂ TRẢ VỀ NHƯ KIỂU INT THÌ GIÁ TRỊ DEFAULT VALUE XÁC ĐỊNH ĐƯỢC TRẢ VỀ.NẾU DEFAULT
//VALUE KHÔNG ĐƯỢC ĐỊNH NGHĨA THÌ SẼ TRẢ VỀ ZERO
//Cố gắng parse sang số
var valueAsInt = (this.getParam(name, defaultValue || 0) * 1);
//Kiểm tra nếu ép kiểu lỗi tức valueAsInt isNaN, thì trả về default
if(isNaN(valueAsInt))
{
return (defaultValue || 0);
} else {
return (valueAsInt);
}
}
function getRenderContext(requestActionLocation, paramNames) {//TRẢ VỀ RENDERCONTEXT CHO
//ACTION PREFIX XÁC ĐỊNH VÀ SUB-SET CỦA CÁC ROUTE PARAM
// Mặc định request action
requestActionLocation = ( requestActionLocation || "" );
// Mặc định các param name
paramNames = ( paramNames || [] );
// Các param name có thể được truyền vào như một name đơn or như một mảng name.
// Nếu là một name đơn được cung cấo, convert nó vào mảng
if ( ! ng.isArray( paramNames ) ) {
paramNames = [ paramNames ];
}
return(
new RenderContext( this, requestActionLocation, paramNames )
);
}
function hasActionChanged() {//XÁC ĐỊNH TRẢ VỀ TRUE NẾU ACTION ĐÃ THAY ĐỔI TRONG REQUEST
//CONTEXT CỤ THỂ
return( action !== previousAction );
}
function hasParamChanged(paramName, paramValue) {//XÁC ĐỊNH NẾU PARAM XÁC ĐỊNH TRƯỚC ĐÓ
//BỊ THAY ĐỔI TRONG REQUEST CONTEXT CỤ THỂ,SO SÁNH SỰ THAY ĐỔI BẰNG GIÁ TRỊ CỤ THỂ
//(paramValue) HOẶC NẾU CHỈ CÓ PARAM NAME ĐƯỢC KHÁI BÁO,SO SÁNH SẼ TRẢ VỀ BẢNG LƯU
//TRƯỚC ĐÓ
// Nếu param value được khai báo và gán trị,lúc đó đơn giản chúng ta muốn dùng nó so sánh
//với bảng lưu hiện tại
if ( ! ng.isUndefined( paramValue ) ) {
return( ! isParam( paramName, paramValue ) );
}
// Nếu param không có trong bảng lưu trước, lúc đó chúng ta cân nhắc thay đổi nó
if (
! previousParams.hasOwnProperty( paramName ) &&
params.hasOwnProperty( paramName )
) {
return( true );
// Nếu param đã có trong bảng lưu trước,nhưng không có ở hiện tại, chúng ta sẽ con nhắc
//để nó sẽ thay đổi
} else if (
previousParams.hasOwnProperty( paramName ) &&
! params.hasOwnProperty( paramName )
) {
return( true );
}
//Những gì chúng ta làm ở trên không làm thay đổi param hiện hữu;
//Chúng ta hãy so sánh giá trị thực tế của họ.
return( previousParams[ paramName ] !== params[ paramName ] );
}
function haveParamsChanged(paramNames) {//XÁC ĐỊNH NẾU BẤT KỲ MỘT THAM SỐ TRONG CÁC THAM SỐ
//XÁC ĐỊNH TRƯỚC ĐÓ BỊ THAY ĐỔI TRONG REQUEST CONTEXT
for ( var i = 0, length = paramNames.length ; i < length ; i++ ) {
if ( hasParamChanged( paramNames[ i ] ) ) {
// Nếu một tham số trong các tham số bị thay đổi, trả về true và không cần tiếp tục
//kiểm tra các tham số khác
return( true );
}
}
//Vòng lặp ở trên thì đã xác định có hay ko thay đổi,nên nếu code chạy đến đây thì trả về false
return( false );
}
function isParam(paramName, paramValue) {//KIỂM TRA XEM CÓ PARAM NÀO TRƯỚC ĐÓ VẪN TỒN TẠI
//GIÁ TRỊ TRƯỚC ĐÓ
if (
params.hasOwnProperty( paramName ) &&
( params[ paramName ] == paramValue )
) {
return( true );
}
return( false );
}
function setContext(newAction, newRouteParams) {//THIẾT LẬP CÁC ĐIỀU KIỆN CHO
//REQUEST CONTEXT MỚI
// Copy action hiện tại và các param vào bảng lưu trước đó
previousAction = action;
previousParams = params;
// Thiết lập action mới
action = newAction;
// Cắt nhỏ action để xác định các section
sections = action.split( "." );
// Update the params collection.
//Update tập hợp các param mới
params = ng.copy( newRouteParams );
}
// Trả về để sử dụng ở nơi khác như public API.
return ({
getNextSection: getNextSection,
getParam: getParam,
getParamAsInt: getParamAsInt,
getRenderContext: getRenderContext,
hasActionChanged: hasActionChanged,
hasParamChanged: hasParamChanged,
haveParamsChanged: haveParamsChanged,
isParam: isParam,
setContext: setContext,
startsWith: startsWith
});
});})(angular,webapp)
声明angularjs代码如何获取函数getParam()中的ng.isUndefined和 ng.copy in setContext function(),我不明白(angular,webapp)是取自以及如何声明的,希望有所帮助 - (function(ng,app){code in here})(angular,webapp)是什么意思
【问题讨论】:
标签: javascript angularjs