我有一个观点&查看需要有条件填充数据的模型。我注意到viewAttached重写仅在每个视图中调用一次...因此最初是我所有init调用的逻辑位置,因为数据非常静态。
但是在我从另一个视图将数据传递到屏幕的情况下,激活调用会在viewAttached之前被触发...所以如果用户之前没有导航到视图...他们的选择不会被选为init函数还没有被调用。
我的问题如下:
哪个钩子被认为是用于执行任何敲除绑定的最相关的钩子,或者我如何修改执行的顺序,如果我这样做......会不会爆炸? :P(因为修改工作部件框架,最终可能会出现不稳定的代码)
视图模型
var vm = {
lookups: lookups,
userInfo: userInfo,
buttons: buttons,
viewAttached: function (view) {
$('.date').datepicker().on('show', function (ev) {
var today = new Date();
var t = today.getFullYear() + "-" + today.getMonth() + '-' + today.getDate();
$(this).data({ date: t }).datepicker('update');
});
console.log('viewAttached');
console.log(view);
// should this move to the activate function?
lookupInit();
},
activate: function (data) {
console.log('activate');
console.log(data);
var id = data.id || undefined;
if (id !== undefined) {
router.isNavigating(true);
http.json('/api/user/' + id)
.done(function (response) {
ko.viewmodel.updateFromModel(vm.userInfo, response);
router.isNavigating(false);
});
}
}
};
答案 0 :(得分:2)
所有数据检索操作都应在activate
中处理。如果依赖多个呼叫,您可能需要链接多个呼叫,或者使用$.when
并行进行多个呼叫。在杜兰达尔1.2。确保返回true,false或者来自激活的承诺,让Durandal知道什么时候可以继续作曲。
viewAttached
的最佳做法是使用传入的view
来限制jQuery选择器,否则您可能会意外地影响视图外的元素。例如
viewAttached: function (view) {
$('.date').datepicker().on('show', function (ev) ...
会变成
viewAttached: function (view) {
$('.date', view).datepicker().on('show', function (ev) ...
或
viewAttached: function (view) {
$(view).find('.date').datepicker().on('show', function (ev) ...
答案 1 :(得分:1)
每次将视图附加到DOM时都会调用ViewAttached,因此每次导航到视图时都会调用它。在激活后始终调用ViewAttached。
要执行init操作,可以通过在activate function中声明一个全局布尔变量来实现。
例如:
function activate()
{
if(notInit){ /* do stuff */
notInit = true;
}
/* do stuff */
}
请查看以下链接,了解Durandal的视图生命周期:
http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks/