2012-10-20 103 views
0

我得到了下面的代碼,這是我遇到的問題。 除了第一個實例,我無法計算'Labouritems'的任何實例的'總'金額,每個實例之後我都沒有計算它。無法更新

var LabourItems = { 
    rate: null, 
    hours: null, 
    total: null, 
    init: function(object) { 
     this.rate = parseInt($(object).children('.rate').first().val(), 10); 
     // var rate = $(object).children('.rate').first(); 
     this.hours =parseInt($(object).children('.hours').first().val(), 10); 
     this.total = this.rate * this.hours; 
     this.updateTotal(object); 
    }, 
    updateTotal: function(object) { 
     $(object).children('.total').first().val(this.total || 0); 
    } 
} 

//reactTochange for those inputs that you want to observe 
$('.labouritems input').on("keyup", function() { 
    $('.labouritems').each(function(key,value){ 
     LabourItems.init(this); 
    }); 
}); 
+0

究竟什麼不行?順便說一下,你應該將全局單例對象的'init'方法重構爲一個簡單的'重新計算'函數。 – Bergi

回答

1

這很簡單:你不創建的任何實例「Labouritems」,你只有一個Labouritems對象。

1

您的代碼中沒有任何「實例」,因爲您從未撥打過new

爲了讓LabourItems被視爲一個對象,聲明它這樣:

function LabourItems(object) { 
    return { 
     rate: null, 
     ... 
    } 
}); 

,然後在你的事件處理程序使用new LabourItems(this)

可選擇地(並且更有效,因爲每個實例將共享的方法的副本,而不是包含其自己的副本)使用正常原型聲明:

function LabourItems(object) { 
    this.rate = null, 
    ... 
}; 

LabourItems.prototype.init = function() { 
    ... 
}; 

LabourItems.prototype.updateTotal = function() { 
    ... 
}; 

並使用new LabourItems(this)如上。

+0

這是非常奇怪的想法,通過'this'作爲參數,而不是像'$(this).LabourItems()'這樣的構造......任何方式都是一團糟......強烈推薦查看一些示例並完全重寫你的代碼 – Reflective

+2

@Reflective如果它恰好在回調的上下文中,那麼傳遞'this'是完全正常的。如果'LabourItems'已被編寫爲jQuery插件,則只有在建議的情況下才能使用。 – Alnitak

+0

這就是想法,希望你會同意,如果一個'Class'使用jQuery在DOM元素集上執行,它應該是一個jQuery插件writean。 – Reflective