Emberjs控制器接收Route的model()方法的返回值?

时间:2018-03-03 12:41:43

标签: ember.js

我正在研究Ember 2.13.0

控制器的Ember.js doco说“The controller receives a single property from the Route – model – which is the return value of the Route's model() method.”。

我不清楚如何访问这些数据。

我有一条看起来像这样的路线:

export default Ember.Route.extend({
    model: function() {
      return this.store.findAll('costcentrehierarchyfortree');
    }
});

一个看起来像这样的控制器:

export default Ember.Controller.extend({
    data: function() {
            var arrJSTreeElements = this.model.map(obj =>{ 
                /*
                 * This is the type of structure that needs to be output
                 *
                [
                    { "id" : "ajson1", "parent" : "#", "text" : "Simple root node" },
                    { "id" : "ajson2", "parent" : "#", "text" : "Root node 2" },
                    { "id" : "ajson3", "parent" : "ajson2", "text" : "Child 1" },
                    { "id" : "ajson4", "parent" : "ajson2", "text" : "Child 2" },
                ]
                */
                var rObj = {};
                rObj['id'] = obj.cchcceidchild;
                if (obj.cchcceidparent === obj.cchcceidchild)
                {
                    //This is the top of the tree
                    rObj['parent'] = "#";
                }
                else
                {
                    rObj['parent'] = obj.cchcceidparent;
                }
                rObj['text'] = obj.ccidescriptionchild;
                return rObj;

            });
            return arrJSTreeElements ;
    }
});

但是当我访问相关路线时,我收到一个控制台错误

Cannot read property 'map' of undefined

所以我想使用this.model访问路由的model()方法返回的数据不是要走的路......所以我做错了什么?

提前致谢。

编辑:为了让我更清楚一下我在这里尝试做什么,你可以在我正在使用的添加的演示应用程序中看到(有些)类似的例子。这是控制器https://github.com/ritesh83/ember-cli-jstree/blob/master/tests/dummy/app/dynamic/controller.js,这里是模板https://github.com/ritesh83/ember-cli-jstree/blob/master/tests/dummy/app/dynamic/template.hbs

遗憾的是,这不是一个直接的例子,因为它依赖于静态文件,而不是由于路由被调用而返回的数据,但它确实至少提供了一些想法。

编辑2:

我能够在Lux和我发现的其他资源的帮助下使用它。

如果这对任何人都有帮助,这是我最终使用的版本,并且可以使用。请注意,处理不再在控制器上,而是在路径上

import Ember from 'ember';

export default Ember.Route.extend({

    model: function() {
        return this.store.findAll('costcentrehierarchyfortree');
    },

    setupController(controller, model) {
        this._super(controller, model);        
        //
        this.store.findAll('costcentrehierarchyfortree').then(function (arrRawCch) {
            var idx = 0;
            var arrJSTreeElements = arrRawCch.map(obj =>{ 
                idx++;
                var rObj = {};
                rObj['id'] = obj.get('cchCceIdChild');
                if (obj.get('cchCceIdParent') === obj.get('cchCceIdChild'))
                {
                    //This is the top of the tree
                    rObj['parent'] = "#";
                }
                else
                {
                    rObj['parent'] = obj.get('cchCceIdParent');
                }
                rObj['text'] = obj.get('cceIdentifierChild');
                //
                // Add non-jstree-standard data into 'data' object
                // see this forum post for more details
                // https://groups.google.com/forum/#!topic/jstree/qBM2ZCAkPL4
                //
                rObj['data'] = {};
                rObj['data']['cchDrvId'] = obj.get('cchDrvId');
                //
                return rObj;
            });

            Ember.set(controller, 'data', arrJSTreeElements)
        });
    },
});

1 个答案:

答案 0 :(得分:1)

首先,何时/如何调用data函数?因为在ember世界中这样的功能似乎有点奇怪。我将此代码实现为computed property

所以,在路由器进入路由后,您确定此代码是运行吗?注意,路由器等待model挂钩返回的promise,并在将模型提供给控制器之前等待来自afterModel挂钩的promise。因此,请确保您的功能不会提前运行。

也是的,你做错了。不应使用this.model。通常,不应使用点表示法来访问ember对象上的属性。 (注意:这只有在当前发布的测试版中does introduce ES5 Getters for Computed Properties的版本3.1之前才有效。)

您应该使用Ember.getobj.get

// legazy import
import Ember from 'ember';
const {get} = Ember;

// import with modules syntax when using ember-cli-babel >= 6.8.0, introduced with ember 2.16
import {get} from '@ember/object'  

// use of .get to access a property. obj might be this or any other ember object. This will work for ember objects and non ember objects.
get(obj, 'foo')

// if obj is an ember object you can also use .get, but this will throw for non ember objects
obj.get('foo')