我正在使用knockout.js库,它有助于数据绑定。所以我一直得到错误,我的变量没有在我们的viewModel原型上的计算函数中定义。我知道这是因为计算出的函数正在改变"这个"到窗口,但我似乎无法弄清楚如何让它更改回根(viewModel)。我指的方法是"消息"在javascript中。话虽如此,如何将上下文更改回viewModel?
这是我的代码:
HTML
p#title.col-xs-12.bg-primary.text-center
| Tic - Tac - Toe!
div.col-xs-3.bg-info
div.bg-primary.controls
span
button.btn.btn-default(data-bind="click:StartMessage.bind($root)")
| New Game
p#message.lead(data-bind="text:Messages.bind($root)()")
table.bg-success(style="table-layout:fixed;")
tr#row1
td(data-bind="click:Messages.bind($root)")
td  
td  
tr#row2
td  
td  
td  
tr#row3
td  
td  
td  
JAVASCRIPT
var message = (function(){
function Message(){
this.main = ko.observable(true);
this.welcome = "Welcome to Tic-Tac-Toe! This is a 2 player game. Click New Game to play!"
this.turn = ", its your turn."
this.win = ", you won!"
this.draw = "It's a draw..."
}
return Message;
})()
var players = (function(){
function Players(){
this.player1 = ko.observable(true);
this.player2 = ko.observable(false);
}
return Players;
})()
var aBox = (function(){
function ABox(){
this.symbol = ko.observable(" ")
}
return ABox;
})()
var viewModel = (function(){
function ViewModel(){
this.GameMessage = new message();
this.thePlayers = new players();
this.r1c1 = new aBox();
this.r1c2 = new aBox();
this.r1c3 = new aBox();
this.r2c1 = new aBox();
this.r2c2 = new aBox();
this.r2c3 = new aBox();
this.r3c1 = new aBox();
this.r3c2 = new aBox();
this.r3c3 = new aBox();
}
/****************************************
************* Messages *****************
****************************************/
ViewModel.prototype.StartMessage = function(){
this.GameMessage.main(false)
}
ViewModel.prototype.Messages = ko.computed(function(){
if(this.GameMessage.main()){
return this.GameMessage.welcome;
}
else if(this.thePlayers.player1()){
this.thePlayers.player1(false);
this.thePlayers.player2(true);
return "Player 1"+this.GameMessage.turn;
}
else if(this.thePlayers.player2())
this.thePlayers.player1(true);
this.thePlayers.player2(false);
return "Player 2"+this.GameMessage.turn;
},ViewModel)
return ViewModel;
})()
ko.applyBindings(new viewModel())
我已尝试将上下文更改为" viewModel"如图所示,$ root," this。"
如果您想知道该方法尝试完成的是什么,当单击“新消息”按钮时,它将触发要显示的消息。然后,如果单击<td>
,它将在前一个地方显示不同的消息。
答案 0 :(得分:0)
ko.computed函数包含allows to bind the computed function this to whichever object you specify的第二个参数。 (在幕后它只使用apply)
因此,当您在原型中定义计算时,您只需将计算结果绑定到this
,如下所示:
ViewModel.prototype.Messages = ko.computed(function(){
// your function code
}, this);
请记住,当您使用原型时,this
会引用您感兴趣的对象实例。