- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这将是一个相当复杂的问题,所以我会在进行过程中不断添加内容。
我的应用程序由两种主要类型的 View 组成 - 标准 View 和区域(一种特殊类型的 View ,专门用于包含其他 View 。我的根应用程序 View 是一个区域,由我可以使用的各种其他区域组成然后根据需要“插入” View 。
我在主要应用程序区域(页眉、页脚、模式等)中的所有 View 都工作得非常好。今天,我尝试在其他 View 中创建一些子区域,但遇到了麻烦。出于某种原因,当我在区域上调用 this.$el.html()
以传递区域分配 View 的输出时,没有任何反应。我可以单步执行代码, View 在其内部很好地呈现,我可以通过查看控制台中的对象模型来查看标记。然而,它从未真正连接到页面,我所看到的只是代表区域包装器的标记。
这里有一些代码——希望它能有意义,虽然它下降了很多级别……
首先是 View 和区域的基类...
define(['backbone', 'helpers/cookie-manager'],
function (Backbone, CookieManager) {
var spinner = "<img src='/content/images/global/ajax-loader.png' alt='loading...' />";
var ministryView = Backbone.View.extend({
name: 'Unnamed View',
sectionName: 'No section specified',
stateRequired: false,
template: undefined,
bindings: [],
initialize: function (options) {
this.options = options || {};
Backbone.View.prototype.initialize.call(this, options);
if (this.options.name) {
this.name = this.options.name;
}
if (this.options.sectionName) {
this.sectionName = this.options.sectionName;
}
if (this.options.template) {
this.template = this.options.template;
}
},
bindToModel: function (model, ev, callback, that) {
if (that === undefined || that === null) {
throw "The value of 'that' needs the context of the extending class in order to operate correctly.";
}
model.bind(ev, callback, that);
this.bindings.push({ model: model, ev: ev, callback: callback });
},
dispose: function () {
this.unbindFromAllModels(); // Will unbind all events this view has bound to
this.stopListening();
this.unbind(); // This will unbind all listeners to events from this view. This is probably not necessary because this view will be garbage collected.
this.remove(); // Uses the default Backbone.View.remove() method which removes this.el from the DOM and removes DOM events.
this.undelegateEvents();
},
render: function () {
this.trigger('rendered');
return this;
},
resetStyleState: function(condition) {
},
trash: function () {
this.dispose();
},
unbindFromAllModels: function () {
_.each(this.bindings, function (binding) {
binding.model.unbind(binding.ev, binding.callback);
});
this.bindings = [];
}
});
var ministryRegion = ministryView.extend({
name: 'Unnamed Region',
currentView: undefined,
initialize: function (options) {
this.options = options || {};
ministryView.prototype.initialize.call(this, options);
if (this.options.currentView) {
this.currentView = this.options.currentView;
}
_.bindAll(this, 'placeRenderedView');
_.bindAll(this, 'showRendering');
},
placeRenderedView: function () {
this.$el.html(this.currentView.$el);
this.currentView.delegateEvents();
if (this.currentView.postRender !== undefined && this.currentView.postRender !== null) {
this.currentView.postRender();
}
},
renderView: function (view) {
if (view) {
if (this.currentView) {
this.currentView.trash();
}
this.currentView = view;
}
this.currentView.bind('rendering', this.showRendering);
this.currentView.bind('rendered', this.placeRenderedView);
this.currentView.render();
},
showRendering: function () {
this.$el.html(spinner);
},
trash: function(disposeRegion) {
this.currentView.trash();
if (disposeRegion !== undefined && disposeRegion !== null && disposeRegion !== false) {
this.dispose();
}
}
});
return {
View: ministryView,
Region: ministryRegion
};
});
现在加载到应用程序中的 View 包含我要将 View 加载到的区域 (mealPlansRegion
)...
define(['ministry', 'jquery', 'views/v-header', 'models/m-ns', 'views/components/components', 'text!templates/hub/member-home.html'],
function (Ministry, $, Header, Models, Components, TemplateSource) {
var memberHomeView = Ministry.SecureView.extend({
name: 'Member Home',
sectionName: 'Hub',
mealPlansRegion: undefined,
template: Handlebars.compile(TemplateSource),
headerView: new Header({ text: 'Kitchen Hub', swatch: 'a' }),
initialize: function (options) {
Ministry.SecureView.prototype.initialize.call(this, options);
},
// Need to override the normal secured view implementation.
render: function () {
this.$el.html(this.template(this));
this.mealPlansRegion = new Ministry.Region({ el: '.meal-plans-container' });
this.mealPlansRegion.renderView(new Components.MealPlansList({ collection: new Models.MealPlan.OwnedCollection({ username: App.session.username() }) }));
this.trigger('rendered');
return this;
},
postRender: function () {
if (!this.isSecured()) {
App.router.navigate('/');
App.renderHome(false);
}
}
});
return memberHomeView;
});
...它是模板...
<section class="meal-plans-container">
</section>
... 目前仅包含该区域的占位符。最终,目的是让其中的几个具有可互换的内容。最后,这是我要加载的 View ...
define(['ministry', 'jquery', 'models/m-meal-plan', 'text!templates/components/meal-plans-list.html'],
function(Ministry, $, MealPlan, TemplateSource) {
var mealPlansListView = Ministry.SecureView.extend({
name: 'Meal Plans List Component',
template: Handlebars.compile(TemplateSource),
render: function () {
var that = this;
if (this.isSecured()) {
this.collection.on('fetching', function () {
that.trigger('rendering');
});
this.collection.fetch({
success: function() {
that.bindData();
that.trigger('rendered');
},
error: function(model, xhr) {
that.$el.html('Unable to fetch meal plan data');
if (console !== undefined && console !== null) {
console.log('Fetch Meal Plan failed: ' + xhr.responseText);
}
that.trigger('rendered');
}
});
} else {
this.applySecureLoginPrompt();
}
return this;
},
bindData: function () {
this.$el.html(this.template({ plans: this.collection.toJSON() }));
}
});
return mealPlansListView;
});
它是模板...
<ul id="mealPlansList" class="swatch-listview-b">
<li class="listview-header">Meal Plans</li>
{{#each plans}}
<li><span class="meal-plan-id-holder hidden">{{id}}</span>{{name}}</li>
{{/each}}
</ul>
对于这个特定的 View ,公共(public)区域代码的这部分失败...
placeRenderedView: function () {
this.$el.html(this.currentView.$el);
this.currentView.delegateEvents();
if (this.currentView.postRender !== undefined && this.currentView.postRender !== null) {
this.currentView.postRender();
}
},
... 而 this.$el.html(this.currentView.$el);
行根本不做任何事情。
如果我能提供任何其他帮助,请告诉我。
最佳答案
在这篇文章的帮助下,我设法解决了这个问题 - Backbone View Nesting
我重写了 memberHomeView
类,并将区域实例化从 render
移到了 postRender
函数中。然后这确保了模板渲染已经完成,允许该区域然后正确实例化(现在我回过头来这就是我首先创建 postRender
方法的原因。
这是修改后的函数...
define(['ministry', 'jquery', 'views/v-header', 'models/m-ns', 'views/components/components', 'text!templates/hub/member-home.html'],
function (Ministry, $, Header, Models, Components, TemplateSource) {
var memberHomeView = Ministry.SecureView.extend({
name: 'Member Home',
sectionName: 'Hub',
mealPlansRegion: undefined,
template: Handlebars.compile(TemplateSource),
headerView: new Header({ text: 'Kitchen Hub', swatch: 'a' }),
initialize: function (options) {
Ministry.SecureView.prototype.initialize.call(this, options);
},
// Need to override the normal secured view implementation.
render: function () {
this.$el.html(this.template(this));
this.trigger('rendered');
return this;
},
postRender: function () {
if (!this.isSecured()) {
SiansPlanApp.router.navigate('/');
SiansPlanApp.renderHome(false);
} else {
// MOVED THE REGION INSTANTIATION HERE
this.mealPlansRegion = new Ministry.Region({ el: '.meal-plans-container' });
this.mealPlansRegion.renderView(new Components.MealPlansList({ collection: new Models.MealPlan.OwnedCollection({ username: SiansPlanApp.session.username() }) }));
}
}
});
return memberHomeView;
});
简单来说....
如果附加到外部标记,请确保标记已呈现,然后再尝试添加使用它的 subview 或区域,否则你可能会哭。
关于javascript - View 中 View 中的主干 View - 为什么 this.$el.html ('insert some content here' ) 什么都不做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475597/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!