骨干延伸破碎

时间:2015-02-28 11:29:48

标签: javascript backbone.js

以前从未发生这种情况,它让我有点恼火......但是如果我创建一个视图并尝试扩展它extend onn&ta功能就像一个有效的实例类。

var gv = Backbone.View.extend({
    //Stuff here
});

console.log(gv);
//child {cid: "view2", $el: jQuery.fn.init[1], el: div.shell, constructor: function, events: Object…}

gv.extend({
    //Stuff here
});
//Uncaught TypeError: gv.extend is not a function

我添加了一个工作示例。



$(document).ready(function() {
  var RN = {};

  RN.gvCreator = Backbone.View.extend({
    el: '.shell',
    render: function() {
      console.info('building stuff');
    }
  });
  //set up the global view for all menu items etc
  RN.gv = new RN.gvCreator();
  RN.gv.render();
  console.info(RN.gv);
  var indexView = RN.gv.extend({
    el: '.content',
    render: function() {
      console.info('working');
    }
  });

  Backbone.history.start();
});

<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.1.2/backbone-min.js"></script>
<div class="shell"></div>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

在您的示例中,您重新分配给RN.gv。起初它是一个构造函数,但是然后你用一个实例来破坏它。

一般来说,视图实例在创建后无法扩展(至少不能使用该方法)。

您可以通过为构造函数和实例分别使用两个变量来解决问题。请注意,在创建实例之后(重新)扩展构造函数只会影响将来的视图实例 - 它们不会追溯性地影响以前创建的视图实例。


修改:在回复下面的评论时,这就是新视图扩展的方式:

  var indexView = RN.gvCreator.extend({
    el: '.content',
    render: function() {
      console.info('working');
    }
  });

这不会影响RN.gv的属性,因为它已经使用RN.gvCreator构造函数创建。 (请注意,上面的RN.gvCreator语句不会修改extend - 相反,会创建一个以RN.gvCreator为基础的新视图构造函数。)

答案 1 :(得分:0)

尝试使用下划线扩展视图的原型对象:

var View = Backbone.View.extend({
  foo: 1
});

console.log(View);

_.extend(View.prototype, {
  bar: 2
});

var aView = new View();

console.log(aView.foo);
console.log(aView.bar);