Ответ 1
Я не уверен, что понимаю вашу точную цель, но Knockout перестанет связываться, когда он столкнется с этим типом проблемы.
Если ваша проблема - это просто переменные undefined, то один трюк, который вы можете использовать, - это привязка к $data.name3
, а не только name3
. Доступ к свойству undefined из допустимого объекта не вызывает ошибки.
Если вы действительно хотите что-то более надежное, вы можете рассмотреть возможность использования поставщика привязки.
Например, вы можете написать быструю оболочку для реального поставщика привязки, например:
var ErrorHandlingBindingProvider = function() {
var original = new ko.bindingProvider();
//determine if an element has any bindings
this.nodeHasBindings = original.nodeHasBindings;
//return the bindings given a node and the bindingContext
this.getBindings = function(node, bindingContext) {
var result;
try {
result = original.getBindings(node, bindingContext);
}
catch (e) {
if (console && console.log) {
console.log("Error in binding: " + e.message);
}
}
return result;
};
};
ko.bindingProvider.instance = new ErrorHandlingBindingProvider();
Это приведет к сбою ошибок, их регистрации и продолжению. Конечно, элемент, который имел это "плохое" связывание, не связан. Если есть какой-то известный способ, с которым вы хотите справиться, тогда вы можете добавить эту логику после обнаружения ошибки. Возможно, вы хотите проверить этот элемент (node) и bindingContext, чтобы определить, что нужно сделать.
Образец: http://jsfiddle.net/rniemeyer/KxXqs/
UPDATE: версия 3.0+, в которой ошибки ловушек/журналов в синтаксисе связывания, а также ошибки, когда фактически оценивается значение границы. http://jsfiddle.net/rniemeyer/ecbn1dmy/