我正在为我的jQuery / javascript代码使用模块模式,我正在使用自我执行的函数,因为我正在为Knockout.js做。 (与官方的knockout.js教程相同)。
这可能是一个非常主观的问题,但我想知道你对它有什么看法,以及淘汰人通常如何在他们的网络应用程序中处理这个问题。
要查找有关此主题的信息并不容易。
你会在同一模块中将knockout.js逻辑和jQuery事件和函数混合在一起吗? 或者你会把它分成不同的文件和不同的模块?
此外,有时某些事件在淘汰赛中不易结合:
$('#demo').on('shown.bs.modal', whatever);
$('#demo').bind('typeahead:select', whatever);
$(this)
并不容易举个例子,假设我有这个模块来处理客户订单:
function order(){
var self = this;
for(var key in data) {
if(!self.hasOwnProperty(key)) {
self[key] = data[key];
}
}
}
function ordersViewModel(){
var self = this;
self.orders = ko.observableArray([]);
//get the orders for the given date range
self.getOrders = function(from, to){
$.get(myUrl + 'orders/getOrders/', function(data){
self.orders(data.map(function(ordersData) {
return new order(ordersData);
}));
});
};
}
var MasterModel = function(){
this.orders = new ordersViewModel()
};
var mm = new MasterModel();
ko.applyBindings(mm);
然后,我有一个Orders模块来处理屏幕上orders元素的所有jQuery事件和动作,这与knockout.js模块分开:
function orders() {
var self = this;
self.tableWrapper = $('#orders-table-wrapper');
self.init = function () {
self.bindEvents();
self.initTypeahead();
};
self.bindEvents = function () {
//when actions menu is hidden
self.tableWrapper.on('hide.bs.dropdown', '.dropdown', self.unSelectActions);
$(document).on("contextmenu", "#orders-table-wrapper table > tbody > tr", self.showContextMenu);
$('#ordersSearch').change(self.search).keyup(function () {
//forcing input change
$(this).change();
});
$('#equipment-id-input').bind('typeahead:select', function (ev, suggestion) {
$('#equipment-id-input').trigger('change');
});
};
//when actions menu is hidden
self.unSelectActions = function () {
$(this).find('.moreActions').removeClass('active');
};
//context menu for orders table
self.showContextMenu = function(event){
//whatever
}
//table filtering
self.search = function(){
//whatever
}
}
var myModels = function(){
this.orders = new orders().init();
};
var myMasterModel = new myModels();
答案 0 :(得分:3)
Knockout的基本规则是:不要在绑定处理程序之外弄乱DOM。鼠标滚轮事件绑定得很好,see here。对于Bootstrap,有绑定here。插件可以轻松地包装在自定义绑定处理程序中(example)。
我强烈建议您熟悉custom binding handlers。使用Knockout作为基本内容,jQuery用于其他所有内容并不比仅仅使用jQuery更好(这会产生热点)。