2013-07-10 28 views
9

Tôi đang gặp sự cố khi áp dụng trình xử lý ràng buộc tùy chỉnh khi sử dụng loại bỏ bằng requireJS. Về cơ bản, trong quá khứ tôi đã bao gồm một tệp js ràng buộc-xử lý toàn cầu chứa tất cả các ràng buộc tùy chỉnh của tôi. Bây giờ tôi đang sử dụng requireJS để thực thi các phụ thuộc, tôi không chắc chắn cách truy cập các ràng buộc tùy chỉnh này.Trình xử lý ràng buộc tùy chỉnh với Knockout và RequireJS

tôi sử dụng để làm tạo ra các chức năng toàn cầu với

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

Bây giờ tôi đang sử dụng đòi hỏi, tôi cảm thấy như thể tôi nên có một định nghĩa tuyên bố

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

Tuy nhiên, tôi don' t tin rằng các ràng buộc sẽ thực hiện trừ khi được gọi cụ thể, có lẽ trong một shim? Có ai có bất kỳ ý tưởng về điều này?

Cảm ơn sự giúp đỡ của bạn,

Trả lời

9

Kể từ bindings tùy chỉnh thay đổi ko đối tượng, chúng chỉ cần được tải một lần và các mô-đun của chúng không cần phải trả lại bất kỳ thứ gì. Nếu bạn có phần chính/mục/ứng dụng là bước đầu tiên trong ứng dụng của mình, chỉ cần yêu cầu các liên kết và bộ mở rộng tùy chỉnh của bạn là tất cả những gì bạn cần làm.

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

    //NO return needed 
}); 

Sau đó, trong phần khởi động của bạn, chỉ cần

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

Một cách dễ dàng để thực hiện việc này là xác định ràng buộc tùy chỉnh của bạn làm mô-đun AMD và yêu cầu từ mô hình chế độ xem gốc của bạn. Ví dụ -

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

viewmodel của bạn -

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

này sẽ cung cấp cho bất kỳ yếu tố trong việc tiếp cận DOM của bạn để xử lý ràng buộc Knockout của 'Ngày' ví dụ. (Ví dụ của tôi là một trong đó tôi đã sử dụng với moment.js)

Trong bất kỳ quan điểm con hoặc quan điểm đòi hỏi mô hình xem cha mẹ của bạn bây giờ bạn sẽ có thể sử dụng

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

tôi đã có thể đạt được điều này bằng cách gói loại trực tiếp trong mô-đun bindings của tôi và trả lại ví dụ loại trực tiếp sửa đổi. Đây là cấu hình tôi đã kết thúc với:

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

tôi cam kết ràng buộc tùy chỉnh:

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

Và module của tôi đòi hỏi phải loại trực tiếp chỉ cần phải tham khảo 'ko'.

require(['jquery', 'ko', 'underscore'], function ($, ko, _) { 
    // do knockout-y things! now with bindings! 
}); 
Các vấn đề liên quan