【问题标题】:Where do i put my Knockout.js Extensions when using Typescript and requirejs使用 Typescript 和 requirejs 时,我在哪里放置我的 Knockout.js 扩展
【发布时间】:2013-03-29 12:44:06
【问题描述】:

我正在将一些 javascript 代码移植到 typescript 并使用 requirejs。我有一个 config.ts:

//file config.ts
///<reference path="../require.d.ts" />
///<reference path="DataLayer.ts" />

require.config({
    baseUrl: '/scripts/App/',

    paths: {
        'jQuery': '/scripts/jquery-1.9.1',
        'ko': '/scripts/knockout-2.2.1',
        'signalR': "/scripts/jquery.signalR-1.0.1",
    },

    shim: {
        jQuery: {
            exports: '$'

        },
         signalR:{
            deps: ["jQuery"]
         },
         ko: {
             deps: ["jQuery"],
             exports: 'ko'
         }
    }
});

// load AMD module main.ts (compiled to main.js)
// and include shims $, _, Backbone

require(['DataLayer', 'signalR', 'ko'], (d ) => {
    alert('test');
    var app = new d.DataLayer();
    app.run();
  //  app.run();

});

它正在加载:

<script data-main="/Scripts/App/config" type="text/javascript" src="~/scripts/require.js"></script>

在我的页面上有一个执行以下操作的脚本标签之前:

ko.bindingHandlers.csharpTypes = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var value = valueAccessor();

        switch (value) {
            case 'System.Boolean':
                element.type = 'checkbox';
                break;
            case 'System.String':
                element.type = 'string';
                break;
            case 'System.DateTime':
                //$(element).replaceWith("<input placeholder='value' data-bind='value:value, uniqueId: name, csharpTypes:type'/>");
                element.type = 'datetime';
                break;
            default:
                element.type = 'number';
        }


    }

};

并且扩展名被添加到淘汰赛中。我不是 100% 确定我现在会把这段代码放在哪里? 如果它在页面中,它在淘汰前加载由requirejs加载。我假设我需要用requirejs加载它,我只是不确定我会怎么做。在打字稿类中,或者可能只是在 config.ts 中?

require(['DataLayer', 'signalR', 'ko'], (d ) => {
        alert('test');
        var app = new d.DataLayer();
        app.run();
      //  app.run();

    });

我试过了:

extensions.ts

     ///<reference path="knockout.d.ts" />    
    export class KnockoutExtenions {
        // Constructor
        constructor() {
            ko.bindingHandlers.csharpTypes = {
                init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
                    var value = valueAccessor();

                    switch (value) {
                        case 'System.Boolean':
                            element.type = 'checkbox';
                            break;
                        case 'System.String':
                            element.type = 'string';
                            break;
                        case 'System.DateTime':
                            //$(element).replaceWith("<input placeholder='value' data-bind='value:value, uniqueId: name, csharpTypes:type'/>");
                            element.type = 'datetime';
                            break;
                        default:
                            element.type = 'number';
                    }


                }

            };
      }
}

但它给了我关于 ko.bindinghandlers 的 csharpTypes 的错误。

【问题讨论】:

    标签: javascript knockout.js requirejs typescript


    【解决方案1】:

    您可以开箱即用地扩展现有的 TypeScript 接口。要定义自己的绑定处理程序,您需要做的就是:

    1. 提供定义文件(比如myBindings.d.ts
    2. 添加以下代码

      interface KnockoutBindingHandlers {
          csharpTypes: KnockoutBindingHandler;
      }
      
    3. 在您的 extensions.ts 文件中引用此定义文件

    【讨论】:

    • 很酷,我回家后会试试这个。如果两个接口被定义为相同的名称,它们只是合并?
    • 是的,确实,它的文档记录不是很好。我会尝试找到一些参考资料。
    • 您是否必须在 d.ts 文件中执行此操作才能正确合并?我已经在 .ts 文件中的绑定处理程序上方内联尝试过它,它似乎不再适用于最新版本的打字稿。它曾经在以前的版本中工作
    • 我有段时间没用过 TypeScript,但是如果你在网上试用一下,在操场上,你可以检查它是否在那里工作。
    • 是的!无论如何,我有点喜欢将它放在 .d.ts 文件中,这是记录所有自定义绑定的好方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多