[英]Custom Binding not working updating from Knockout 2.3 to 3.3
我的 Windows 8.1 應用程序在 Knockout 2.3 上運行良好,但在更新到 3.3 后,似乎我在自定義綁定中得到了錯誤的上下文。
首先是我如何在我的應用程序的命令欄中為單個元素應用綁定:
var cmdArray = [];
var commandIsRunning = function() {
return _.any(cmdArray, function(command) {
return command.isRunning();
});
};
_.each(_bottomCommands, function (row) {
if(row.command) {
// command wrapper
var commandWrapper = ko.command({
action: function() {
var rowCommand = row.command();
if (rowCommand) {
return rowCommand();
}
return WinJS.Promise.as();
},
canExecute: function() {
var rowCommand = row.command();
if (rowCommand) {
return rowCommand.canExecute() && !commandIsRunning();
}
return false;
}
});
cmdArray.push(commandWrapper);
//Bind the command
var element = document.querySelector('#' + row.id);
if (element) {
element.setAttribute('data-bind', 'command: $data');
ko.applyBindings(commandWrapper, element);
}
}
});
這是我的自定義綁定代碼
ko.bindingHandlers.command = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var command = ko.utils.unwrapObservable(valueAccessor());
ko.bindingHandlers.click.init.call(this, element, ko.observable(command), allBindingsAccessor, viewModel, bindingContext);
},
update: function (element, valueAccessor, allBindingsAccessor) {
var command = ko.utils.unwrapObservable(valueAccessor());
ko.bindingHandlers.enable.update.call(this, element, command.canExecute, allBindingsAccessor);
}
};
問題在於:
ko.bindingHandlers.enable.update.call(this, element, command.canExecute, allBindingsAccessor);
canExecute
未定義,我認為這是因為我沒有在init
和update
處理程序中獲得正確的上下文。 那么我在代碼中做錯了什么? 代碼再次在 Knockout 2.3 中工作,所以這可能是 Knockout 問題嗎?
更新:我創建了 jsFiddle 來顯示問題。 它包含ko.command
的定義,因為我認為這可能是導致問題JSFiddle
導致該錯誤的原因是 Knockout 3.x 綁定到不同的功能。 在 2.x 中,您可以直接綁定到一個函數,但在 3.x 中,Knockout 調用該函數來獲取視圖模型。 您仍然可以綁定到 Knockout 3.x 中的函數,但您需要將其包裝在 observable 或其他函數中。
ko.applyBindings(function() { return commandWrapper }, element);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.