0

私は新しい 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 は、2 つの異なる SharePoint リストから建物/場所オブジェクトの observableArray を返します。オブジェクトの各属性は ko.observable() として定義されていることに注意してください。私が見たものはすべて、他のドロップダウン変数 (この場合は locationID) が更新されたときに、AJAX 呼び出しを使用して選択ボックスを自動入力しようとする単一のファイル バイスに基づく連鎖を示しています。関数は、次のように機能するという点で正常に機能します (2 つのドロップダウンをリンクしないだけです)。

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>

私がかなり簡単だと思っていたことが、そうではありませんでした。私はちょうどキックが必要な近くに感じます。

ありがとう!

4

1 に答える 1

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

2 番目のオプション: 関数を呼び出した後に () を追加しbm.getBuildingsAsJSON()ます。計算すると、次のようになります。

  vm.buildings = ko.computed(function(){

        if(vm.locationID() === undefined){              
        return bm.getBuildingsAsJSON()();
        } else {
            return bm.getBuildingsAsJSON(vm.locationID().id())();
    }

bm.getBuildingsAsJSON3 番目のオプション:関数で監視可能な配列を返さない。

于 2012-08-21T08:06:32.390 に答える