我想从骨干视图测试我的观点。但我遇到问题,我尝试使用this.$el
获取我的视图元素,结果为空。当我检查this.el
时,结果为undefined
当我尝试使用$('#container')
搜索它时,它存在,当我运行它时,它也有效。标签存在,
这是我的观点代码
define([
'jquery',
'underscore',
'backbone',
'text!templates/setting.html',
'js/service/Config'
],function($, _, Backbone, settingTemplate, Config){
var settingView = Backbone.View.extend({
el: $("#container"),
initialize: function(){
_.bindAll(this, "render");
},
render: function(){
data = {}
var compiledTemplate = _.template(settingTemplate, data);
this.$el.append(compiledTemplate);
this.delegateEvents();
DroneConfig.getAll(function(obj){
$('input[name=url]').val(obj.url);
$('input[name=repo]').val(obj.repo);
$('input[name=hostname]').val(obj.hostname);
$('textarea[name=api_key]').val(obj.api_key);
});
}
});
return settingView;
});
这是我的测试代码:
define(['js/view/settingView','text!templates/setting.html'], function(SettingView, texts){
describe("Setting View", function() {
it('render successfully', function() {
$('body').append(__html__['app/js/test/test.html']);
$(document).ready(function(){
var x = new SettingView();
x.render();
expect($('#setting').html()).to.not.be.empty;
});
});
});
});
你知道为什么会这样吗?我甚至尝试添加$(document).ready(function(){})
。感谢
答案 0 :(得分:3)
请记住,$('#container')
是函数调用,因此您的代码与此相同:
var $el = $('#container');
var settingView = Backbone.View.extend({
el: $el,
//...
});
这意味着您的代码将在执行#container
时查找Backbone.View.extend
。显然,当发生这种情况时,没有#container
元素,因此当Backbone尝试取消jQuery-ify undefined
时,你最终得el
el
值el
提供了。
最简单的解决方案是将jQuery内容留给Backbone,只需使用el: '#container'
的选择器:
#container
然后Backbone会在需要构建$el
时咨询DOM,到那时你应该有{{1}}。