2013-07-10 39 views
9

我有一个问题应用自定义绑定处理程序与requireJS使用淘汰赛。基本上,过去我已经包含一个全局绑定处理程序js文件,其中包含我所有的自定义绑定。现在我正在使用requireJS来强制执行依赖关系,但我不确定如何访问这些自定义绑定。自定义绑定处理程序与淘汰赛和RequireJS

我用来做与

function KOCustomBindings() { 
// Custom Bindings 
ko.bindingHandlers.returnKey = { 
//handler code 
} 
} 

现在,我使用需要创建全局的功能,我觉得我应该有一个明确说法

define(['jquery', 'knockout'], 
    function($, ko)){ 
// Custom Bindings 
return KOCustomBindings; 
} 
}); 

不过,我不相信绑定会执行,除非专门调用,也许在垫片?有没有人有任何想法呢?

感谢您的帮助,

回答

9

由于自定义绑定修改ko对象,它们只需要加载一次,并且它们的模块不需要返回任何东西。如果您的应用程序的第一步有一个主/入口/应用程序部分,则只需要您的自定义绑定和扩展程序即可。

define(['jquery', 'knockout'], function($, ko)){ 
    // Custom Bindings 
    ko.bindingHandlers.returnKey = { ... } 

    //NO return needed 
}); 

然后,在你的启动部分,只是

require('lib/custom-ko-bindings'); 
3

一个简单的方法来做到这一点是定义为AMD的模块自定义绑定,并要求它从父视图模型。示例 -

Bindings.js

define(, function() { 
    ko.bindingHandlers.Date = { 
     update: function (element, valueAccessor) { 
      var value = valueAccessor(); 
      var date = moment(value()); 
      var strDate = date.format('MM-DD-YYYY'); 
      $(element).text(strDate); 
     } 
    }; 
}); 

您的视图模型 -

define(['jquery', 'knockout', 'bindings'], 
    function($, ko, bindings)){ 
}); 

这会在你的DOM接入例如 '日期' 的淘汰赛结合的处理程序给予任何元素。 (我的例子是一个我与moment.js使用)

在现在需要你的父视图模型任何子观点或意见,你应该能够使用

<span data-bind="Date: myDate" /> 
3

我能够在我的绑定模块包装淘​​汰赛并返回修改后的淘汰赛实例来实现这一目标。这里是我结束了与配置:

require.config({ 
    paths: { 
    'knockout': 'lib/knockout', // name that's only used once in customBindings.js 
    'ko': 'app/customBindings' 
    } 
    // more config ommitted 
}); 

我的自定义绑定:

define(['knockout'], function (ko) { 
    ko.bindingHandlers.returnKey = { 
     //handler code 
    } 
    return ko; 
}); 

而我的模块需要的淘汰赛只需要引用“KO”。

require(['jquery', 'ko', 'underscore'], function ($, ko, _) { 
    // do knockout-y things! now with bindings! 
});