0

私はそよ風.js クエリから監視可能な配列を返そうとしています。

問題

typescript のメソッド呼び出しを使用して呼び出したい場合、ブリーズ js クエリからのデータを onservable 配列として返すにはどうすればよいですか。詳細: 関数 getAllFileStructures(callback) は、promise で監視可能な配列データを返しません。私はそよ風でクエリを呼び出して、データを取り戻したいです。getAllFileStructures に実行させたいことを紹介するために、testgetAllFileStructures を作成しました。

testgetAllFileStructures は次を返します

ここに画像の説明を入力

HTML

        <script src="~/Scripts/Custom/filerepo/filestructure.DataContext.js"></script>

    <script>

        function load() {
            var SimpleListModel2 = function () {
                var DbCtx = new DataContext.FileStructure("breeze/FileRepoBreeze/");
                this.items = DbCtx.testgetAllFileStructures();
//in a perfect world i would be able to change this to getAllFileStructures() and it will //just work.

        }.bind(this);  // Ensure that "this" is always this view model

            ko.applyBindings(new SimpleListModel2(), document.getElementById("test"));
        }

        window.onload = load;


    </script>



    <div id="test">
        <select multiple="multiple"  data-bind="options: items"> </select>
        </div>

Typescript ファイル

module DataContext {
    export class FileStructure {
        private EntityQuery: breeze.EntityQuery;
        private Manager: breeze.EntityManager;

        constructor(MainController: string) {
            //validate the format api/BreezeController/  
            this.EntityQuery = new breeze.EntityQuery;
            this.Manager = this.configureBreezeManager('breeze/FileRepoBreeze/');
        }
        private configureBreezeManager(MainController: string) {
            breeze.NamingConvention.camelCase.setAsDefault();
            return new breeze.EntityManager(MainController);
        }

         public getAllFileStructures(callback) {
             //define the query

            var query =
                this.EntityQuery
                    .from('GetAllFiles')
                    .using(this.Manager).execute()
                    .then(function (data) {
                        return callback(data);
                    })
                    .fail(this.queryFailed);
         }
        public testgetAllFileStructures (){

            var myObservableArray = ko.observableArray();    
            myObservableArray.push('Some TEST'); 
            return myObservableArray;
        }

         public queryFailed(error) {
             alert(error);
        }
    }
}
4

1 に答える 1

1

私は TypeScript の専門家ではありませんが、「Some TEST」をオブザーバブルにプッシュしているので、もちろんそれが返されます。クエリから data.results を返すか、それらをオブザーバブルに保存して返す必要があります。

 public getAllFileStructures() {
    var query =
        this.EntityQuery
            .from('GetAllFiles')
            .using(this.Manager).execute()
            .then(function (data) {
                var someObservable = ko.observableArray();
                return someObservable(data.results);
            })
            .fail(this.queryFailed);
 }

これにより、データ結果で満たされたオブザーバブルが返されます。オブザーバブルを渡してから入力しようとしている場合は、次のようにします-

 var myObservable = ko.observableArray();
 getAllFileStructures(myObservable);

 public getAllFileStructures(myObservable) {
    var query =
        this.EntityQuery
            .from('GetAllFiles')
            .using(this.Manager).execute()
            .then(function (data) {
                return myObservable(data.results);
            })
            .fail(this.queryFailed);
 }

TypeScript クラスではなく HTML でスクリプトを定義している理由と、それを使って何をしているのかについては、私はお手伝いできません。そのビュー モデル ロジックを TypeScript クラスに移動することをお勧めしますが、それはあなた次第です。私の理解では、標準の JavaScript で TypeScript を定義した後にビュー モデルを定義することはできますが、それを理解する必要があります。

于 2013-07-06T16:50:55.840 に答える