杜兰达尔的激活者

时间:2013-08-21 15:14:07

标签: javascript durandal

我偶然发现了与 Durandal 中的Activator Lifecycle Callback相关的问题。

这是我的模型,有一堆回调。

define(function () {
    return {
        activate: activate,
        viewAttached: viewAttached,
        detached: detached,
        deactivate: deactivate,
        title: 'Lifecycle'
    };

    function activate() {
        debugger;
    }
    function viewAttached() {
        debugger;
    }
    function detached() {
        debugger;
    }
    function deactivate() {
        debugger;
    }
});

但不会引发 分离的 停用的 方法。

根据文档,这些回调在激活器存在时运行。所以问题是我如何在我的模型中添加一个激活器模块?

更新:模型的组成如下:

<!-- ko compose: { model: 'lifecycle', activate: true } -->
<!-- /ko -->

2 个答案:

答案 0 :(得分:2)

您使用的是什么版本的Durandal?

如果您使用的是Durandal 1.x,则“分离”方法不存在。它是在2.0版本中添加的。此外,'viewAttached'方法在2.0版中已更改为“附加”。

无论版本如何,您都会错误地拼写'deactivate'方法。最后没有'd'。

答案 1 :(得分:1)

https://github.com/dFiddle/dFiddle-1.2/blob/gh-pages/App/samples/knockout/index.js查看Durandal 1.2淘汰赛样本,了解如何手动使用activator

define(function () {
    var system = require('durandal/system'),
        viewModel = require('durandal/viewModel');

    return {
        activeSample:viewModel.activator(),
        introSamples: [{
            name: 'Hello World',
            hash: '#/knockout-samples/helloWorld',
            moduleId: 'samples/knockout/helloWorld/index'
        }, 
        ...
        ],
        activate: function (args) {
            var that = this;

            if (!args.name) {
                args.name = 'helloWorld';
            }

            return system.acquire('samples/knockout/' + args.name + '/index').then(function(sample) {
                that.activeSample(sample);
            });
        }

router默认实现激活器,因此所有事件生命周期事件都可用。通过使用activate: true,仅启用了事件子集。

自2.0发布以来,Durandal的1.2文档无法在线获取,但仍可从http://durandaljs.com/pages/downloads/下载。以下是解释该情景的Hooking-Lifecycle-Callbacks.html中的相关部分。

  
      
  1. 路由器有一个名为“activeItem”的内部激活器,用于管理当前页面。
  2.   
  3. 您可以随时通过要求视图模型模块并调用其激活器功能来自行创建激活器。这回来了   计算的observable,用作对象的激活器。
  4.   
  5. 当您致电app.setRoot时,您的根模块上会使用激活器。
  6.   
  7. 如果您在撰写绑定上设置activate:true,则会在合成期间使用激活器。
  8.         

    注意:案例3和4略有不同,因为它们只强制执行 canActivate 激活回调;不是停用生命周期。   要启用它,您必须自己使用完整的激活器(情况1或2)。