我得到一个未捕获的TypeError:无法读取属性' target'在beforeAppear中调用 widget.Test()时未定义。
define(
//-------------------------------------------------------------------
// DEPENDENCIES
//-------------------------------------------------------------------
['knockout'],
// -------------------------------------------------------------------
// MODULE DEFINITION
// -------------------------------------------------------------------
function (ko) {
"use strict";
return {
First_Arr: ko.observableArray(['arrayItem0', 'arrayItem1', 'arrayItem2', 'arrayItem3']),
Second_Arr: ko.observableArray(['arrayItem0', 'arrayItem1', 'arrayItem2']),
Test: function(widget, event) {
var element = event.target;
var pathname = location.pathname;
var anotherArray = [
["/some-url-path", widget.First_Arr()],
["/some-other-url-path", widget.Second_Arr()]
];
for (var i = 0; i < anotherArray.length; i++) {
// Do some stuff and console.log the array items
}
},
beforeAppear: function(page) {
var widget = this;
widget.Test();
}
}
}
);
奇怪的是,如果我在视图中创建一个按钮,例如:
<button id="btn-click" data-bind="click: Test">test</button>
然后单击它,然后我得到所需的结果,按预期将我的数组内容打印到控制台。
PS。我试着注释掉 var element = event.target; 行,因为我认为这是问题的根源,但是这只产生了以下内容:未捕获的TypeError:无法读取属性&#39; First_Arr()&#39;未定义的。
这个有点不知所措。任何帮助都会有所帮助。
答案 0 :(得分:0)
当您致电widget.Test()
时,您没有向其传递一个事件参数,因此event
将被取消定义,而event.target
将会出错,因为target
不存在于“undefined” ”。在单击绑定中,单击“事件”将自动传递到函数中。
第二个问题是var widget = this;
基本上是设置widget = beforeAppear;
。在函数内“this”指的是函数本身。见How does the "this" keyword work?
不是将模块定义为对象文字,而是使用构造函数来改善运气。见Should I be using object literals or constructor functions?
这可能看起来像:
define(
//-------------------------------------------------------------------
// DEPENDENCIES
//-------------------------------------------------------------------
['knockout'],
// -------------------------------------------------------------------
// MODULE DEFINITION
// -------------------------------------------------------------------
function (ko) {
"use strict";
return function(){
var self = this;
self.First_Arr = ko.observableArray(['arrayItem0', 'arrayItem1', 'arrayItem2', 'arrayItem3']);
self.Second_Arr = ko.observableArray(['arrayItem0', 'arrayItem1', 'arrayItem2']);
self.Test = function(widget, event) {
var element = event.target;
var pathname = location.pathname;
var anotherArray = [
["/some-url-path", self.First_Arr()],
["/some-other-url-path", self.Second_Arr()]
];
for (var i = 0; i < anotherArray.length; i++) {
// Do some stuff and console.log the array items
}
}
self.beforeAppear = function(page) {
//var widget = this;
self.Test();
}
}();
}
);