0
var BaseView = Backbone.View.extend({
    localizedTemplate : function (element) {
        template = _.template(element.html());

        return function (data) {
            return template($.extend({}, data, resource));
        };
    }
});

var DerivedView = BaseView.extend({
   initialize: function (options) {
       this.model = options.model;

       this.template = function () {
         return this.localizedTemplate($("#someTemplate"));
       };
   },

   render: function () {
       var output = this.template(this.model.toJSON());
       this.$el.append(output);
       return this;
   }
});

为什么上面的代码不起作用?为什么我无法在 DerivedView 中调用 someFunction?有没有办法做到这一点?

我正在使用 Backbone 最新版本。

4

2 回答 2

2

当你这样做时:

this.template = function () {
    return this.localizedTemplate($("#someTemplate"));
};

您正在为this.template. 请注意,localizedTemplate它还返回一个函数:

return function (data) {
    return template($.extend({}, data, resource));
};

这意味着这this.template是一个返回函数的函数,而第二个函数是想要this.model.toJSON()作为参数的函数。

你这样做:

var output = this.template(this.model.toJSON());

中的函数this.template忽略它的参数并返回一个函数,这给你留下了这个函数:

function () {
    return this.localizedTemplate($("#someTemplate"));
}

output. 您可能认为output此时是一大块 HTML,因此您将其交给append

this.$el.append(output);

但是output是一个函数,append当以函数作为参数调用时会做什么?jQuery 像这样调用该函数:

function(index, html)
类型:Function()
一个函数,它返回一个 HTML 字符串、DOM 元素或 jQuery 对象,以插入到匹配元素集中每个元素的末尾。接收集合中元素的索引位置和元素的旧 HTML 值作为参数。在函数内,this指的是集合中的当前元素。

因此,该output函数将被 jQuery 调用,appendappend提供编译后的模板函数无法理解的参数。结果是一大堆混乱。

如果你真的想做这样的事情,那么你需要自己调用所有的函数,这样你就可以在正确的地方获得正确的参数:

var output = this.template()(this.model.toJSON());
// -----------------------^^

演示:http: //jsfiddle.net/ambiguous/YyJLR/

或者更好的是,根本不用理会所有额外的包装器。在你的观点中这样说initialize

this.template = this.localizedTemplate($("#someTemplate"));

然后在render

var output = this.template(this.model.toJSON());

演示:http: //jsfiddle.net/ambiguous/BQjhS/

另请注意,您不需要this.model = options.model视图构造函数将为您执行此操作:

有几个特殊选项,如果通过,将直接附加到视图:modelcollectionelidclassName和。tagNameattributes

于 2013-09-27T23:03:50.560 回答
0
var DerivedView = BaseView.extend({
   someVariable: function(someData) {
      return this.someFunction(someData);
   }
});
于 2013-09-27T14:17:59.150 回答