我正在研究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)
});
},
});
答案 0 :(得分:1)
首先,何时/如何调用data
函数?因为在ember世界中这样的功能似乎有点奇怪。我将此代码实现为computed property。
所以,在路由器进入路由后,您确定此代码是运行吗?注意,路由器等待model
挂钩返回的promise,并在将模型提供给控制器之前等待来自afterModel
挂钩的promise。因此,请确保您的功能不会提前运行。
也是的,你做错了。不应使用this.model
。通常,不应使用点表示法来访问ember对象上的属性。 (注意:这只有在当前发布的测试版中does introduce ES5 Getters for Computed Properties的版本3.1之前才有效。)
您应该使用Ember.get
或obj.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')