【问题标题】:Durandal: View model activation/initialisation phasesDurandal:查看模型激活/初始化阶段
【发布时间】:2013-07-02 03:36:19
【问题描述】:

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

【问题讨论】:

    标签: single-page-application durandal singlepage


    【解决方案1】:

    所有数据检索操作都应在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) ...
    

    【讨论】:

      【解决方案2】:

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

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

      例如:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 2019-11-02
        • 1970-01-01
        相关资源
        最近更新 更多