Le associazioni personalizzate sono implementate all'interno di osservabili calcolati, in modo che le dipendenze siano tracciate e la funzionalità update
possa essere nuovamente attivata.
Per la tua funzionalità, potresti prendere in considerazione l'utilizzo di osservabili calcolati che tracciano gli oggetti, accedono alle dipendenze e fanno tutti gli aggiornamenti/le chiamate api necessarie.
Fino ad ora non ho usato tessuto, ma qui ci sarebbe una ripresa in cui si definisce un modello di vista per rappresentare un rettangolo e si crea un calcolo per aggiornare continuamente l'oggetto tessuto quando cambiano i valori.
// 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);
Un'altra idea breve, se si preferisce mantenere un po 'del tessuto/tela chiamate dal vostro modello di vista (probabilmente lo farei). È possibile creare un binding fabric
che includa una matrice di forme da aggiungere al canvas. Dovresti anche passare un gestore che recupera i parametri da passare ad esso. L'associazione quindi creerebbe la forma, la aggiungerà alla tela e quindi creerà un calcolo per aggiornare la forma sulle modifiche. Qualcosa di simile:
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
});
});
}
};
Si potrebbe metterlo su una tela come:
<canvas data-bind="fabric: [ { type: 'Rect', params: rect.getParams }, { type: 'Rect', params: rect2.getParams } ]"></canvas>
A quel punto, il modello di vista potrebbe essere semplificato un po 'per rappresentare solo i dati del rettangolo. Esempio qui: http://jsfiddle.net/rniemeyer/G6MGm/
Ti è dispiaciuto condividere un violino o un'altra demo con la sorgente che ha un collegamento dati bidirezionale? Riesco a vedere l'unidirezionale del violino nella risposta qui sotto. Inoltre, hai affrontato altri problemi con fabric & knockout? –
Non abbiamo continuato con il tessuto. Abbiamo iniziato a utilizzare jointjs.com, che è basato su svg (anziché su tela), che ci consente di incorporare html all'interno dei grafici e collegarli a quelli. Non sto raccomandando questa libreria esatta di per sé, ma qualcosa di simile sarebbe una scelta sbagliata, immagino. È un po 'difficile creare rapidamente un violino dopo tutto questo tempo. – bertvh
grazie per aver condiviso. Sto creando un PoC con JointJS e knockoutjs. Puoi condividere qualsiasi violino per questo? Sto cercando di incorporare html all'interno degli elementi di jointjs. –