Typescript和breeze从查询返回可观察数组

时间:2013-07-05 15:45:42

标签: knockout.js typescript breeze

我只是想从breeze.js查询中返回一个可观察的数组。

问题

如果我想使用typescript中的方法调用来调用它,那么如何将breeze js查询中的数据作为onservable数组返回。 详细信息:函数getAllFileStructures(callback)不返回promise中的可观察数组数据。我想用breeze调用一个查询并获取数据。我创建了testgetAllFileStructures来展示我想要的getAllFileStructures。

testgetAllFileStructures返回以下

enter image description here

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>

打字稿文件

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

1 个答案:

答案 0 :(得分:1)

我不是TypeScript的专家,但是你正在将'Some TEST'推送到你的observable中,所以当然这就是要返回的内容。您需要从查询中返回data.results或将它们存储在一个observable中并返回它。

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

这将返回一个填充了您的数据结果的可观察量。如果你试图传入一个observable然后填充它,你会这样做 -

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

至于为什么你的HTML中定义了一个脚本而不是你的TypeScript类中的脚本,以及你用它做了什么,我无法帮助你。我建议将该视图模型逻辑移动到您的TypeScript类,但这取决于您。根据我的理解,你仍然可以在标准JavaScript中的TypeScript定义之后定义你的视图模型,但你必须想出那个!