Проблема заключается в том, что расхождение является методом объекта Product, а не свойства. Нельзя связать элемент DOM с методом, только со свойством.
Способ, которым я решил проблему, состоит в том, чтобы (a) сделать Discrepancy свойством и (b) использовать методы convert и convertBack, чтобы убедиться, что это новое свойство было обновлено правильно.
Вот мой блок скриптов:
function Product() {
this.InStock = 0;
this.Ordered = 0;
this.Discrepancy = 0;
}
var products = [];
$(document).ready(function () {
products[0] = new Product();
products[1] = new Product();
var calcDiscrepancy = function(value, source, target) {
$(target).data("Discrepancy", target.InStock - target.Ordered);
return value;
};
var changeInStock = function (value, source, target) {
target.InStock = value;
return calcDiscrepancy(value, source, target) ;
};
var changeOrdered = function (value, source, target) {
target.Ordered = value;
return calcDiscrepancy(value, source, target) ;
};
var showDiscrepancy = function(value, source, target) {
$(target).text(value.toString());
};
$("form").link(products[0], {
InStock: {
name: "product0_InStock",
convert: changeInStock
},
Ordered: {
name: "product0_Ordered",
convert: changeOrdered
},
Discrepancy: {
name: "product0_Discrepancy",
convertBack: showDiscrepancy
}
});
$("form").link(products[1], {
InStock: {
name: "product1_InStock",
convert: changeInStock
},
Ordered: {
name: "product1_Ordered",
convert: changeOrdered
},
Discrepancy: {
name: "product1_Discrepancy",
convertBack: showDiscrepancy
}
});
});
Проходя через это:
добавить свойство Discrepancy
к классу Product
со значением по умолчанию 0. Удалите материал ComputeDiscrepancy.
напишите пару функций, которые принимают к сведению изменения в InStock
и Ordered
. Они обновят соответствующие свойства целевого объекта, а затем вызовут функцию с именем calcDiscrepancy
и вернут ее возвращаемое значение.
calcDiscrepancy
обновит значение до свойства Discrepancy
целевого объекта. Чтобы все события были вызваны этим изменением, я использовал метод jQuery .data()
.
написать метод showDiscrepancy
, который бы обновлял содержимое цели с использованием переданного значения (цель будет элементом DOM). Я также изменил элементы «несоответствия» вместо текстовых полей: иначе это не имело смысла.
Вызовы link()
теперь отображают соответствующие элементы DOM на соответствующие свойства и задают конвертеры для каждого. Для свойства InStock конвертер является типом convert и вызывает changeInStock
и т. Д. Для свойства Discrepancy конвертер является типом convertBack, который вызывает showDiscrepancy
. (По сути, convert
переходит от элемента DOM к свойству объекта, а convertBack
переходит от свойства к элементу.)