我是新手和KnockoutJS,并使用SPServices与SharePoint列表进行交互。我试图创建一个级联下拉,我有点卡住了。基本上我有一个位置列表和该位置的建筑物列表。在选择位置时,我构建了一个CAML查询,以过滤掉建筑物下拉列表中显示的数据库。非常感谢大家在这个网站上工作。在过去的几个月里,我一直无法帮助我,似乎无法在这个问题上找到任何东西。下面代码的结束状态是一个适用于地点的下拉菜单,但是一旦显示就会显示为空的下拉菜单。
使用Javascript:
var bm = new BuildingModel();
var lm = new LocationModel();
var ViewModel = function(){
var vm = this;
vm.locationID = ko.observable();
vm.buildingID = ko.observable();
vm.locations = lm.getLocationsAsJSON();
vm.buildings = ko.computed(function(){
if(vm.locationID() === undefined){
return bm.getBuildingsAsJSON();
} else {
return bm.getBuildingsAsJSON(vm.locationID().id());
}
});
基本上,getXXXXAsJSON从两个不同的SharePoint列表返回一个observableArray建筑物/位置对象。请注意,对象中的每个属性都定义为ko.observable()。我看到的所有内容都显示基于单个文件的链接,尝试使用AJAX调用自动填充选择框,因为另一个下拉变量(在本例中为locationID)已更新。函数工作正常,以下工作(只是不链接两个下拉列表):
vm.locations = lm.getLocationsAsJSON();
vm.buildings = bm.getBuildingsAsJSON();
HTML:
<select data-bind="options: locations, optionsText: function(location){return location.longName}, value: locationID, optionsCaption:'Choose...'"></select>
<select data-bind="options: buildings, optionsText: 'number', value: buildingID, optionsCaption: 'Choose...'"></select>
我认为非常直接的事情并非如此。我觉得亲近只需要一脚。
谢谢!
答案 0 :(得分:0)
如果要将此计算绑定到选择控件,则不应返回计算中的可观察数组。计算的是函数和可观察数组也是函数,当选项绑定试图解析你的计算值时,它使用ko.utils.unwrapObservable()
函数来获得实际值,但它返回另一个函数(可观察数组)而不是真实数据。
有3种可能的解决方法:
第一个选项:
致电ko.utils.unwrapObservable()
功能bm.getBuildingsAsJSON()
。您计算的内容如下:
vm.buildings = ko.computed(function(){
if(vm.locationID() === undefined){
return ko.utils.unwrapObservable(bm.getBuildingsAsJSON());
} else {
return ko.utils.unwrapObservable(bm.getBuildingsAsJSON(vm.locationID().id()));
}
第二种选择:
调用bm.getBuildingsAsJSON()
函数后添加()。您计算的内容如下:
vm.buildings = ko.computed(function(){
if(vm.locationID() === undefined){
return bm.getBuildingsAsJSON()();
} else {
return bm.getBuildingsAsJSON(vm.locationID().id())();
}
第三种选择:
不要在bm.getBuildingsAsJSON
函数中返回可观察数组。