1

我有一个需要有条件地填充数据的视图和视图模型。我注意到 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);
                    });
            }
        }
  };
4

2 回答 2

2

所有数据检索操作都应在activate. $.when如果它们被依赖或用于并行进行多个调用,您可能必须链接多个调用。在杜兰达尔 1.2。确保从 activate 返回 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) ...
于 2013-07-01T19:36:19.927 回答
1

每次视图附加到 DOM 时都会调用 ViewAttached,因此每次导航到视图时都会调用它。ViewAttached 总是在激活之后调用。

要执行初始化操作,您可以通过在激活函数中声明一个全局布尔变量来实现。

例如:

function activate()
{
   if(notInit){ /* do stuff */ 
       notInit = true;
   }
   /* do stuff */
}

请查看以下链接了解 Durandal 的视图生命周期:

http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks/

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

于 2013-07-01T19:32:16.490 回答