淘汰赛无法处理绑定“foreach”
我是Knockout的新手,我正在构建一个实际上是大型计算器的应用程序。 到目前为止,我在一个页面上运行了两个淘汰赛实例。 一个例子工作得非常好,但是另一个例子完全坏了,似乎根本就没有注册?
下面是我的Javascript,fetchYear是完全正常工作的函数,fetchPopulation是完全破坏的那个。 它似乎没有从HTML中注册“ageview”,我无法弄清楚。
错误:
未捕获的ReferenceError:无法处理绑定“foreach:function(){return ageView}”消息:未定义ageView
提前致谢。
JS:
var index = { fetchYear: function () { Item = function(year){ var self = this; self.year = ko.observable(year || ''); self.chosenYear = ko.observable(''); self.horizon = ko.computed(function(){ if(self.chosenYear() == '' || self.chosenYear().horizon == undefined) return []; return self.chosenYear().horizon; }); }; YearViewModel = function(yeardata) { var self = this; self.yearSelect = yeardata; self.yearView = ko.observableArray([ new Item() ]); self.add = function(){ self.yearView.push(new Item("New")); }; }; ko.applyBindings(new YearViewModel(yearData)); }, fetchPopulation: function () { popItem = function(age){ var self = this; self.age = ko.observable(age || ''); self.chosenAge = ko.observable(''); self.population = ko.computed(function(){ if(self.chosenAge() == '' || self.chosenAge().population == undefined) return []; return self.chosenAge().population; }); }; PopulationViewModel = function(populationdata) { var self = this; self.ageSelect = populationdata; self.ageView = ko.observableArray([ new popItem() ]); self.add = function(){ self.ageView.push(new popItem("New")); }; }; ko.applyBindings(new PopulationViewModel(populationData)); } } index.fetchYear(); index.fetchPopulation();
HTML:
当你这样做(在fetchYear
):
ko.applyBindings(new YearViewModel(yearData));
您使用YearViewModel
视图模型绑定整个页面。 但是YearViewModel
没有一个名为ageView
的属性,所以你得到错误并且淘汰停止尝试绑定其他任何东西。
你需要做的是通过将你想要的元素传递给ko.applyBindings
来限制你的绑定只覆盖部分dom。 例如:
//....
然后:
ko.applyBindings(new YearViewModel(yearData), document.getElementById("yearVM")); //... ko.applyBindings(new PopulationViewModel(populationData), document.getElementById("popVM"));
现在,您的绑定仅限于实际显示该模型中的内容的DOM部分。
另一种方法是将两个视图模型作为父视图模型的一部分,然后您可以将绑定应用于整个页面。 如果您需要混合来自两个VM的部件,并且在页面的不同部分中不方便地将它们分开,这将使其更容易。 就像是:
var myParentVM = { yearVM : index.fetchYear(), // note, make this return the VM instead of binding it popVM : index.fetchPopulation(), // ditto } ko.applyBindings(myParentVM);
然后你就像这样声明你的绑定:
这不起作用的主要原因是因为你在一个页面上不止一次调用ko.applyBindings()(这不是真的被禁止但在我看来是一个不好的做法)。
如果需要调用它两次,则必须使用容器调用它,该容器适用于此绑定的区域。
像这样的东西:
ko.applyBindings(new YearViewModel(yearData), document.getElementById('YourYearViewElementId'));
您得到的错误来自第一个绑定,它尝试处理整个页面,但在其ViewModel中找不到“ageView”。
如果您为单个页面构建单个ViewModel,那么如果需要,您可以使用子模型。
这种情况的一些伪代码:
var Section1ViewModel = function() { var self = this; self.property1 = ko.observable(); self.myComputed = ko.computed(function () { // do some fancy stuff }); self.myFunc = function() { // do some more fancy stuff }; } var Section2ViewModel = function() { var self = this; self.property1 = ko.observable(); self.myComputed = ko.computed(function () { // do some fancy stuff }); self.myFunc = function() { // do some more fancy stuff }; } var PageViewModel = function() { var self = this; self.section1 = ko.observable(new Section1ViewModel()); self.section2 = ko.observable(new Section2ViewModel()); self.myGlobalFunc = function() { // do some even more fancy stuff } } ko.applyBindings(new PageViewModel());
希望有所帮助。
最好的问候,克里斯