Javascript Knockoutjs vm未绑定到正确的元素
我有两个模型Javascript Knockoutjs vm未绑定到正确的元素,javascript,knockout.js,observable,Javascript,Knockout.js,Observable,我有两个模型 1. vm1 (for page1.php) 2. vm2 (for page2.php) 它们在单独的js文件中。vm1的绑定方式如下: VM1.js $(function() { //other stuff // see orders is defined here gs.vm1 = function(){ var orders = ko.observableArray([]); }(); ko.appl
1. vm1 (for page1.php)
2. vm2 (for page2.php)
它们在单独的js文件中。vm1的绑定方式如下:
VM1.js
$(function() {
//other stuff
// see orders is defined here
gs.vm1 = function(){
var orders = ko.observableArray([]);
}();
ko.applyBindings(gs.vm1, document.getElementById('page1_id'));
);
vm2绑定到如下对话框:
VM2.JS
$(function(){
//other stuff
// orders is NOT defined here
gs.vm2 = function(){...}();
ko.applyBindings(gs.vm2, document.getElementById('page2_id'));
});
正如您所看到的,我在与kojs站点上提到的特定元素的绑定中是显式的:
当我加载page1.php,其中vm1应该是有界的,我得到以下错误:
Uncaught ReferenceError: Unable to process binding "foreach: function(){return orders }"
Message: orders is not defined
这是page1.php中的模板代码,我在其中使用foreach:
<div id="page1_id">
<div data-bind="foreach: orders">
<input class="form-check-input" type="checkbox">
<span data-bind="text: ...some observable..."></span>
</div>
</div>
我正在使用一个模块显示模式,该模式显示我想要公开的变量,订单就是其中之一。我发现了问题,并将发布答案,以防有人犯与我相同的错误。 正如我在问题中所说,vm1代表一个对话框,给该对话框的id是page1_id。我在page2上没有该对话框,当ko应用绑定时,它找不到该id,并且会将null传递给
ko.applyBindings = function (viewModelOrBindingContext, rootNode) {...}
作为第二个参数。
如果查看ko代码,则节点的设置方式如下:
rootNode = rootNode || window.document.body;
因此,如果您传递null,那么主体基本上就是您的上下文,因为没有在那里定义顺序,所以会出现错误
因此,我想教训是(至少对我来说)确保绑定中的显式定义是否正确地定义在所需页面上。@Ray,为什么会这样?在我的虚拟机中,这将是窗口上下文。您能否尝试从
vm1
viewmodel的定义中删除最后两个括号()
?@YuriyN.,这将做什么?这将把立即调用的函数表达式转换为简单函数,适合作为Knockout的viewmodel。
rootNode = rootNode || window.document.body;