Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 查看对主干集合的特定修改_Backbone.js_Handlebars.js_Backbone Relational - Fatal编程技术网

Backbone.js 查看对主干集合的特定修改

Backbone.js 查看对主干集合的特定修改,backbone.js,handlebars.js,backbone-relational,Backbone.js,Handlebars.js,Backbone Relational,我有一个主干模型,我们称之为Foo,它包括n个子模型的集合,我们称之为Bar,在一个特定的视图中,我只想显示这些子模型中的m个,以及沿剩余n-m行的消息 现在,我得到的是这样的东西: var FooView = Backbone.View.extend({ ... render: function() { this._barViews = []; var bars = this.model.get("bars"); var tha

我有一个主干模型,我们称之为Foo,它包括n个子模型的集合,我们称之为Bar,在一个特定的视图中,我只想显示这些子模型中的m个,以及沿剩余n-m行的消息

现在,我得到的是这样的东西:

var FooView = Backbone.View.extend({
    ...
    render: function() {
        this._barViews = [];
        var bars = this.model.get("bars");

        var that = this;
        _.each(bars.first(maxToShow), function(bar) {
            that._barViews.push(new BarView({model:bar}));
        }

        var remaining = bars.length - maxToShow;
        this.model.set("remaining", remaining > 0 ? remaining : undefined;

        var json = this.model.toJSON();
        $(this.el).html(this.template(json));

        _(this._holdViews).each(function(hv) {
            holdList.append($(hv.render().el));
        });
    }
});
这是可行的,但感觉有点不对劲,因为我正在向模型中注入剩余消息,尽管这是特定于此特定视图的。另一个视图可能会显示所有的条形图,也可能不会显示任何条形图,并且可能会有也可能没有剩余的消息。我对嵌套视图也不太感兴趣,因为它们意味着创建一个额外的模板文件,并且必须记住将其包含在FWIW中,我使用handlebar.js作为模板,并进行服务器端编译


是否有更好的方法1将bars集合过滤到MaxShowed项,2生成/包括视图中剩余的编号?

您需要一个视图模型,该模型专门用于处理有关将使用它的特定视图的问题。幸运的是,这在JavaScript中非常简单

使用Object.create可以获得一个新的对象实例,该实例继承自作为参数传入的原始对象。这使我们能够用新代码装饰原始模型,而不必实际更改原始模型

在您的情况下,我们希望用剩余的信息装饰foo模型。不过,我们只需要在toJSON结果中包含该信息,所以我们只将其添加到该方法中



function buildFooViewModel(model){
  var foovm = Object.create(model);

  foovm.toJSON = function(){
    // call the original model's toJSON
    var args = Array.prototype.slice.apply(arguments);
    var json = model.toJSON.apply(this, args);

    // add the needed "remaining" data using your calculations, here
    json.remaining = bars.length - maxToShow;

    // send the json data back
    return json;
  }

}

var FooView = Backbone.View.extend({

  initialize: function(){
    // use the view model instead of the original
    this.model = buildFooViewModel(this.model);
  },

  render: function(){
    // your normal render stuff here... calling this.model.toJSON
    // will return your JSON data with the `remaining` field in it already
  }

});


我经常这样做,因为我的观点需要这样的计算。例如,在数据库管理屏幕中,您可以看到它在到处发生,例如%已使用/剩余,以及其他类似的值。

您需要一个视图模型,该模型专门用于处理有关将使用它的特定视图的问题。幸运的是,这在JavaScript中非常简单

使用Object.create可以获得一个新的对象实例,该实例继承自作为参数传入的原始对象。这使我们能够用新代码装饰原始模型,而不必实际更改原始模型

在您的情况下,我们希望用剩余的信息装饰foo模型。不过,我们只需要在toJSON结果中包含该信息,所以我们只将其添加到该方法中



function buildFooViewModel(model){
  var foovm = Object.create(model);

  foovm.toJSON = function(){
    // call the original model's toJSON
    var args = Array.prototype.slice.apply(arguments);
    var json = model.toJSON.apply(this, args);

    // add the needed "remaining" data using your calculations, here
    json.remaining = bars.length - maxToShow;

    // send the json data back
    return json;
  }

}

var FooView = Backbone.View.extend({

  initialize: function(){
    // use the view model instead of the original
    this.model = buildFooViewModel(this.model);
  },

  render: function(){
    // your normal render stuff here... calling this.model.toJSON
    // will return your JSON data with the `remaining` field in it already
  }

});

我经常这样做,因为我的观点需要这样的计算。例如,在数据库管理屏幕上,对于%已使用/剩余,以及其他类似的值,您可以看到它到处发生