当前位置: 首页 > 知识库问答 >
问题:

将durandal与jaydata和kendoui一起使用

裴英锐
2023-03-14

我创建了一个新的VS2012项目使用热毛巾模板,作为回报,使用Durandal,淘汰赛和微风。

我想使用jaydata而不是微风,对于ui层,我想使用出色的asKendoDataSource()功能来为kendoui网格供电。

我按照所有的指示,使kendoui工作良好的杜兰达尔。这很好。

我有一个模型,在这个模型中,我获取jaydata实体并在其上运行asKendoDataSource()。“我的视图”是一个MVVM声明的kendoui网格,其源属性设置为viewmodel的属性,该属性包含对asKendoDataSource()的引用。

在淘汰赛世界中,viewModel属性将是一个空实体=ko.observableArray(),然后在数据服务返回时使用实体(值)初始化。

我需要模拟这一点,这样我就有了一个viewModel属性,它是一个空的kendo数据源,然后当数据从jaydata返回时,由asKendoDataSource()转换初始化。这样,mvvm剑道网格最初绑定到空数据源,然后在调用asKendoDataSource()时接收其项。

这都是因为durandal中的model-viewModel绑定是异步的,并且从一开始就需要在viewModel中有一个占位符属性,然后在解决viewModel的activate()方法promise后,该占位符属性将使用绑定的数据进行更新,并反过来为viewModel绑定到的DOM提供电源。

我不知道如何模仿Knockoutjs的做法,一个空的可观察数组绑定到dom,然后(相同的确切引用)被初始化并填充dom。似乎没有办法创建空的kendo数据源,然后由asKendoDataSource()方法重新初始化。将viewModel属性重新分配到新数据源不起作用,因为剑道网格绑定到原始引用。

这是我对机场的看法:

<section>
    <h2 class="page-title" data-bind="text: title"></h2>
    <div id="airportGrid" data-kendo-role="grid" data-kendo-sortable="true" data-kendo-pageable="true" data-kendo-page-size="25" data-kendo-editable="true" data-kendo-columns='["Id", "Abbrev", "Name"]' data-kendo-bind="source: airports"></div>    
</section>

这是我的数据上下文:

define([
    'durandal/system',
    'services/logger'],
    function (system, logger) {


        var getAirports = function (airportsObservable) {
            $data.Entity.extend("Airport", {
                Id: { type: "int", key: true, computed: true },
                Abbrev: { type: String, required: true, maxLength: 200 },
                Name: { type: String, required: true, maxLength: 512 }
            });

            $data.EntityContext.extend("JumpSeatDatabase", {
                Airports: { type: $data.EntitySet, elementType: Airport }
            });

            var airportDB = new AirportDatabase('http://localhost:2663/odata');
            var deferred = Q.defer();
            airportDB.onReady(function () {
                deferred.resolve(airportDB.Airports);
            });

            return deferred.promise;
        }
        var datacontext = {
            getAirports: getAirports
        };

        return datacontext;

        function log(msg, data, showToast) {
            logger.log(msg, data, system.getModuleId(datacontext), showToast);
        }

        function logError(msg, error) {
            logger.logError(msg, error, system.getModuleId(datacontext), true);
        }
        //#endregion
});

这是我的机场视图模型:

define(['services/datacontext', 'durandal/plugins/router'],
    function (datacontext, router) {
        var airports = null;// = kendo.data.ObservableArray([]);

        var activate = function () {
            var airportRes = datacontext.getAirports();
            return airportRes.then(function (airp) {
                vm.airports = airp.asKendoDataSource();
            });
        };

        var deactivate = function() {
            //airports([]);
        };

        var viewAttached = function (view) {
            //using this type of reach in to the viewModel is considered bad practice in durandal
            //$('#airportGrid').kendoGrid({
            //    dataSource: airports.asKendoDataSource({ pageSize: 10 }),
            //    filterable: true,
            //    sortable: true,
            //    pageable: true,
            //    height: 500,
            //    columns: ['Id', 'Abbrev', 'Name']
            //});
            //kendo.init($("#container"));
            kendo.bind(view, vm);//this should eventually go away the recommended ViewModelBinder code in main.js is not firing for me
        };


        var vm = {
            activate: activate,
            deactivate: deactivate,
            airports: airports,
            title: 'Airports',
            viewAttached: viewAttached
        };
        return vm;
    });

我看到的最后一个问题是:在我看来,MVVM声明了kendoui网格,通过数据kendo bind={source:airports)“绑定到视图模型,其中airports是通过entities.asKendoDataSource()创建的viewmodel的属性不起作用。不知何故,网格没有显示数据。是否需要做一些额外的工作?

谢啦

共有1个答案

叶福
2023-03-14

我最好的猜测是这是一个时间问题,网格绑定到vm。机场仍为空,然后是vm。机场。asKendoDataSource() 已绑定后是否调用?或许可以尝试以下方式:

return airportRes.then(function (airp) {
    vm.airports.data(airp.asKendoDataSource().data());
});

 类似资料:
  • 我正在尝试学习python、mongodb和flask,我正在使用Miguel Grinberg提供的非常优秀的博客,他在博客上提供了一套很棒的教程。米格尔格林伯格。通用域名格式 我有一个小的RESTful服务器工作正常,但现在想从mongo而不是mysql中提取东西 我可以使用下面的代码拉出mongo记录,但我很难让它呈现出来。 我在下面的代码中使用了箭头来显示我在哪里挣扎,我认为缺乏经验。任何

  • 在谷歌搜索了很多之后,现在感到困惑和沮丧。 我正在将一个应用程序从Hibernate 3升级到4。这在使用dtd 3.0时效果很好,但现在需要使用4.0 xsd,而这正是一切都要基于apex的地方! 该应用程序使用hbm.xml文件来配置每个实体,没有任何注释。 找到hbm文件的示例将非常有用,但即使是hibernate 4的教程也只使用3.0 dtd! 我正在使用以下内容 使用它,我得到了一个长

  • 我目前正在使用Wink 1.1.1和Spring 3.1.2迁移一个Java应用程序从WAS7到WAS8.5.5。我正在尝试使用Wink 8.5中可用的本地Wink集成,而不是使用我们目前在Wink 7中使用的单独Wink罐。 我得到了一个错误的服务器启动,看起来像这样: 原因:java。lang.ClassNotFoundException:org。阿帕奇。眨眼服务器内部的登记处。java上的R

  • 问题内容: 因此,我一直在为这个(应该是)简单的练习而绞尽脑汁,以使该程序将日期字符串转换为对象,对其进行格式化,并在完成后将其作为字符串再次返回。 这是程序的最后一点,它从文件中获取一小段文本,将其分解为单独的记录,然后将记录分解为单独的数据并将它们分配给个人对象。 我已经在多个位置检查了该代码,并且该代码完全执行了应该执行的操作,直到调用了format函数(该函数抛出)为止。为对象分配了应该分

  • 问题内容: 我想在目录中获取具有特定扩展名的文件列表。在中,我看到了可以做到这一点的方法。 由于我需要特定的扩展名,因此我创建了一个。但是,当我与此一起使用时,出现编译错误。我以为自以来,我应该能够做到这一点。代码如下: 最后一行显示编译错误: 类型的方法不适用于类型的参数 我正在尝试使用,不是。为何编译器无法识别这一点? 如果我编写自己的扩展筛选器,则此方法有效。我宁愿使用而不愿自己写。我究竟做

  • 问题内容: 我正在尝试在我的watchKit应用中使用firebase数据库。我已经在我的iPhone应用程序上开发了此功能,但是发现在我的Watch应用程序上很难做到这一点。当我尝试将firebase导入watch应用程序的VC类中时,它正在创建error 。 可以在Watch app中使用Firebase吗? 问题答案: 可悲的是,没有支持,并由于这样的事实,有没有支持在这些版本中,并高度依赖