Javascript 在敲除组件中丢失上下文
我使用requirejs将组件打包为单个AMD模块,如下示例: 问题在于,在调用viewmodel中的函数时添加单击事件时,self属性不包含viewmodel并将其指向窗口。是什么导致了这个问题?顺便说一句,如果它们是在没有requirejs的情况下加载的,并且它们是内联的,那么这个问题就不会发生 Index.html:Javascript 在敲除组件中丢失上下文,javascript,knockout.js,knockout-mapping-plugin,knockout-3.0,knockout-components,Javascript,Knockout.js,Knockout Mapping Plugin,Knockout 3.0,Knockout Components,我使用requirejs将组件打包为单个AMD模块,如下示例: 问题在于,在调用viewmodel中的函数时添加单击事件时,self属性不包含viewmodel并将其指向窗口。是什么导致了这个问题?顺便说一句,如果它们是在没有requirejs的情况下加载的,并且它们是内联的,那么这个问题就不会发生 Index.html: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Dipping your feet into KnockoutJS Components</title>
<link href="Content/bootstrap.css" rel="stylesheet" />
<link href="Content/bootstrap-theme.css" rel="stylesheet" />
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">KO Components</a>
</div>
</div>
</div>
<div class="container body-content" style="padding-top:50px">
<h2>Dipping your feet into KnockoutJS Components</h2>
<hr />
<greeter params='name: " Sumit!"'></greeter>
<greeter params='name: " Optimus!"'></greeter>
<greeter params='name: " Bumblebee!"'></greeter>
</div>
<footer class="navbar navbar-fixed-bottom">
<div class="container-fluid">
<p> © 2014 - Still Learning</p>
</div>
</footer>
<script src="App/boot/require.config.js"></script>
<script data-main="App/boot/startup" src="Scripts/require/require.js"></script>
</body>
</html>
startup.js
定义(['jquery','knockout','bootstrap'],函数($,ko){
greeting.html-组件模板
<div class='container-fluid'>
<div> Hello <span data-bind='text: greeting'></span></div>
<div> It is <span data-bind='text: date'></span></div>
<input type="button" value="test" data-bind="click: testClick" />
</div>
JavaScript编译器尝试对闭包进行智能处理。由于函数不使用闭包中的任何变量,因此函数根本不包含闭包。将代码更改为此,您将看到它是有效的:
self.testClick = function () {
console.log(self);
debugger;
};
你能发布完整的代码并添加重现问题所需的代码吗?顺便说一句,代码在github上唯一的变化是在组件viewmodel中添加了一个click函数,并在组件template中使用它。mmh-你没有将任何viewmodel传递给ko.applyBindings(),不确定这是否有效…请尝试至少放置一个空文本{}我有一个更复杂的例子,我将viewmodel传递到ApplyBings函数,但它仍然存在相同的问题。这就是我发现问题的原因。我尝试只输入空文本以确保它仍然无法解决问题。我注意到的另一个问题是,在html和requirejs中都存在引用敲除。您应该删除引用如果你使用的是requirejs,请参考html中的ko。引导和jqueryReally奇怪。我知道我昨天尝试了console.log的东西,但无法获取viewmodel上下文。今天早上,当我尝试放置console.log时,viewmodel中的上下文就在那里。谢谢你的帮助:)真奇怪!我当然无法解释这一点。
<div class='container-fluid'>
<div> Hello <span data-bind='text: greeting'></span></div>
<div> It is <span data-bind='text: date'></span></div>
<input type="button" value="test" data-bind="click: testClick" />
</div>
function greeterViewModel(params) {
var self = this;
self.greeting = ko.observable(params.name);
self.date = ko.observable(new Date());
self.testClick = function () {
//self is pointing to window instead of greeterViewModel
debugger;
};
}
return { viewModel: greeterViewModel, template: greeterTemplate };
});
self.testClick = function () {
console.log(self);
debugger;
};