Durandal:查看模型激活/初始化阶段

时间:2013-07-01 15:11:50

标签: single-page-application durandal singlepage

我有一个观点&查看需要有条件填充数据的模型。我注意到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);
                    });
            }
        }
  };

2 个答案:

答案 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/

http://durandaljs.com/documentation/View-Model/