Knockout.js 具有多个函数调用的KnockoutJS和级联下拉列表

Knockout.js 具有多个函数调用的KnockoutJS和级联下拉列表,knockout.js,Knockout.js,我是一名新手,是一名优秀的JS,使用SPServices与SharePoint列表交互。我试图创建一个级联下拉列表,但有点卡住了。基本上,我有一个位置列表和该位置的建筑列表。当选择一个位置时,我构造一个CAML查询,以过滤掉建筑物下拉列表中显示的数据库。非常感谢每个人在这个网站上的工作。在过去的几个月里,他给了我很大的帮助,只是在这个问题上似乎找不到任何东西。下面代码中的“结束状态”是一个适用于位置的下拉列表,但一旦显示建筑,则为空下拉列表 Javascript: var bm = new Bu

我是一名新手,是一名优秀的JS,使用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());
    }

  });
<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>
本质上,getxxasjson从两个不同的SharePoint列表返回建筑物/位置对象的ObservalArray。请注意,对象中的每个属性都定义为ko.observable()。我所看到的一切都显示了基于单个文件的链接,在更新另一个下拉变量(在本例中为locationID)时,尝试使用AJAX调用自动填充选择框。这些函数可以正常工作,因为以下功能可以正常工作(只是没有链接这两个下拉列表):

HTML:

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());
    }

  });
<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>

我认为非常直截了当的事情并没有发生。我感觉很近,只需要踢一脚


谢谢

如果要将此computed绑定到select控件,则不应在computed中返回可观察数组。Computed is function和observable array也是function当options binding尝试解析您的计算值时,它使用
ko.utils.unwrapObservable()
函数获取实际值,但它返回另一个函数(observable array)而不是实际数据

有3种可能的修复方法:

第一种选择: 为您的
bm.getBuildingsAsJSON()函数调用
ko.utils.unwrapObservable()
。您将看到以下内容:

  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()));
    }
  vm.buildings = ko.computed(function(){

        if(vm.locationID() === undefined){              
        return bm.getBuildingsAsJSON()();
        } else {
            return bm.getBuildingsAsJSON(vm.locationID().id())();
    }
第二种选择: 在调用
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()));
    }
  vm.buildings = ko.computed(function(){

        if(vm.locationID() === undefined){              
        return bm.getBuildingsAsJSON()();
        } else {
            return bm.getBuildingsAsJSON(vm.locationID().id())();
    }
第三种选择:
不要在
bm.getBuildingsAsJSON
函数中返回可观察数组。

谢谢!那帮了大忙!我改为让getBuildingsAsJSON只返回一个建筑对象数组,而不是observableArray,它的工作方式就像champ。谢谢你的帮助!仅仅是学习了这一点,我的生活就变得轻松多了,只是我想我还不明白所有的细微差别。