Các ràng buộc tùy chỉnh được thực hiện bên trong các quan sát được tính toán, để các phụ thuộc được theo dõi và chức năng update
có thể được kích hoạt lại.
Có vẻ như đối với chức năng của mình, bạn có thể muốn xem xét sử dụng quan sát tính toán theo dõi đối tượng của bạn, truy cập phụ thuộc, và thực hiện bất kỳ cập nhật/cuộc gọi api cần thiết.
Trước đây tôi chưa từng sử dụng vải, nhưng đây sẽ là nơi bạn xác định mô hình xem để thể hiện hình chữ nhật và tạo tính liên tục cập nhật đối tượng vải khi bất kỳ giá trị nào thay đổi.
// create a wrapper around native canvas element (with id="c")
var canvas = new fabric.Canvas('c');
var RectangleViewModel = function (canvas) {
this.left = ko.observable(100);
this.top = ko.observable(100);
this.fill = ko.observable("red");
this.width = ko.observable(100);
this.height = ko.observable(100);
this.rect = new fabric.Rect(this.getParams());
canvas.add(this.rect);
this.rectTracker = ko.computed(function() {
this.rect.set(this.getParams());
canvas.renderAll();
}, this);
};
RectangleViewModel.prototype.getParams = function() {
return {
left: +this.left(),
top: +this.top(),
fill: this.fill(),
width: +this.width(),
height: +this.height()
};
};
var vm = new RectangleViewModel(canvas);
ko.applyBindings(vm);
Một ý tưởng ngắn gọn khác, nếu bạn muốn giữ một số vải/canvas gọi ngoài kiểu xem của bạn (tôi có thể sẽ). Bạn có thể tạo một ràng buộc fabric
mà mất trong một loạt các hình dạng để thêm vào canvas. Bạn cũng sẽ vượt qua một trình xử lý truy lục các tham số để truyền cho nó. Các ràng buộc sau đó sẽ tạo ra hình dạng, thêm nó vào vải, và sau đó tạo ra một tính toán để cập nhật hình dạng trên thay đổi. Một cái gì đó như:
ko.bindingHandlers.fabric = {
init: function (element, valueAccessor) {
var shapes = valueAccessor(),
canvas = new fabric.Canvas(element);
ko.utils.arrayForEach(shapes, function (shape) {
//create the new shape and initialize it
var newShape = new fabric[shape.type](shape.params());
canvas.add(newShape);
//track changes to the shape (dependencies accessed in the params() function
ko.computed(function() {
newShape.set(this.params());
canvas.renderAll();
}, shape, {
disposeWhenNodeIsRemoved: element
});
});
}
};
Bạn có thể đặt nó trên một canvas như:
<canvas data-bind="fabric: [ { type: 'Rect', params: rect.getParams }, { type: 'Rect', params: rect2.getParams } ]"></canvas>
Vào thời điểm đó, mô hình xem có thể được đơn giản hóa khá một chút để chỉ đại diện cho dữ liệu của hình chữ nhật. Ví dụ ở đây: http://jsfiddle.net/rniemeyer/G6MGm/
bạn có phiền khi chia sẻ một câu đố hoặc bản trình diễn khác với nguồn có liên kết dữ liệu hai chiều không? Tôi có thể thấy một cách ràng buộc trong fiddle trong câu trả lời dưới đây. Ngoài ra, bạn đã phải đối mặt với bất kỳ vấn đề khác với vải và loại trực tiếp? –
Chúng tôi không tiếp tục với vải. Chúng tôi bắt đầu sử dụng jointjs.com, dựa trên svg (thay vì canvas), cho phép chúng tôi nhúng html vào bên trong biểu đồ và ràng buộc với các biểu đồ đó. Tôi không đề xuất thư viện chính xác này nhưng mỗi thứ tương tự sẽ là một lựa chọn của tôi. Đó là một chút khó khăn để nhanh chóng tạo ra một fiddle sau tất cả thời gian này. – bertvh
cảm ơn bạn đã chia sẻ. Tôi đang tạo một PoC với JointJS và knockoutjs. Bạn có thể chia sẻ bất kỳ fiddle cho điều này? Tôi đang xem xét nhúng html bên trong các phần tử jointjs. –