2016-03-23 6 views
0

Wenn meine Backbone-Modelle Beziehungen haben (z. B. von Backbone-relational erstellt), können diese Beziehungen möglicherweise nullfähig sein, sodass die Felder für Fremdschlüssel manchmal null lauten.Wie verhindern Sie, dass Knockback.js Anzeigemodelle für Nullbeziehungen erstellt?

Wenn ich mehrere Rückstoß-Ansicht Modelle habe, und ich habe Fabriken angegeben, so dass beim Befolgen von Beziehungen ich die Ansicht Modelle mit der gewünschten Funktionalität für das Modell, wenn es ein Attribut, das null ist, geht es weiter und erstellt ein Ansichtsmodell, das null als model übergibt, das wahrscheinlich die meisten Funktionen des Ansichtsmodells zerstört.

Beispiel:

var ChildViewModel = kb.ViewModel.extend({ 
    constructor: function (model, options) { 
     // this is the problem I'm trying to avoid - creating a view model with 
     // no model 
     if (!model) { 
      // just report the error somehow - the jsfiddle has the 
      // relevant HTML element 
      document.getElementById("error").innerHTML = "ChildModelView initialised without a model!"; 
     } 
     kb.ViewModel.prototype.constructor.apply(this, arguments); 
    } 
}); 

var ParentViewModel = kb.ViewModel.extend({ 
    constructor: function (model, options) { 
     // specify factories here, because this way you can easily deal with 
     // reverse relationships, or complicated relationship trees when you 
     // have a large number of different types of view model. 
     kb.ViewModel.prototype.constructor.call(
      this, 
      model, 
      { 
       factories: {relation1: ChildViewModel, 
          relation2: ChildViewModel}, 
       options: options 
      } 
     ); 
    } 
}); 

// if we assume that relation2 is a nullable relationship, backbone-relational, 
// for example, would give us a model that looks like this: 
var model = new Backbone.Model({ 
    id: 1, 
    relation1: new Backbone.Model({id: 2}), // this works fine 
    relation2: null // this causes a problem 
}); 

var view_model = new ParentViewModel(model); 

Und die Geige:

https://jsfiddle.net/vbw44vac/1/

Antwort

1

Ich habe gerade herausgefunden, was ich denke, ist eine vernünftige Lösung.

Ihre Fabriken müssen nicht ViewModel "Klassen" sein, sondern können Factory-Funktionen sein. Also:

var nullable = function (view_model_class) { 
    var factory = function (object, options) { 
     if (object === null) return object; 

     return new view_model_class(object, options); 
    }; 
    return factory; 
}; 

Und dann, wenn Sie die Definition Ihrer Fabriken:

kb.ViewModel.prototype.constructor.call(
     this, 
     model, 
     { 
      factories: {relation1: nullable(ChildViewModel), 
         relation2: nullable(ChildViewModel)}, 
      options: options 
     } 
    );