Javascript Ember.js(pre4)阵列控制器未保持状态
编辑2013-03-02 这似乎在RC1中得到了解决Javascript Ember.js(pre4)阵列控制器未保持状态,javascript,ember.js,ember-router,Javascript,Ember.js,Ember Router,编辑2013-03-02 这似乎在RC1中得到了解决 在以前版本的Ember.js中,控制器将保持分配给它们的状态,但在Pre4中这似乎是一个问题 所以如果我有这个控制器 App.UsersController = Ember.ArrayController.extend({ content: ['mike', 'jen', 'sofia'], _content_observer: (function(){ /* I'm called, but my aut
在以前版本的Ember.js中,控制器将保持分配给它们的状态,但在Pre4中这似乎是一个问题 所以如果我有这个控制器
App.UsersController = Ember.ArrayController.extend({
content: ['mike', 'jen', 'sofia'],
_content_observer: (function(){
/* I'm called, but my author doesn't know why */
console.log('Content was altered! But why? And by whom?');
}).observes('content')
});
由于某些无法解释的原因,内容被覆盖。我不想使用余烬数据,但似乎我是被迫这样做的
这就是一个例子
发生什么事了?我该如何阻止它,或者这是如此深陷于余烬的自以为是之中,以至于我需要接受它并随波逐流
编辑 再进一步,无论设置为
模型
的是什么,似乎都将设置为内容
值,即使您覆盖设置控制器
挂钩
e、 g:
UsersController.content
将以值['This'、'Shouldnt'、'Be'、'Assigned']结束
查看更新的这并不是真正的余烬数据。新路由器自动设置控制器的内容属性。通过覆盖模型挂钩,自定义将用于路由的模型,而不是从控制器deinition中设置内容。例如:
App.UsersRoute = Ember.Route.extend({
model: function() {
return ['mike', 'jen', 'sofia', 'greta']
}
}
我在这里修改了您的JSFIDLE:您可以使用setupController
方法来设置控制器的内容:
setupController:功能(控制器){
controller.set('content',[]);
}
看
编辑
您可以使用model
方法返回原始内容:
模型:函数(){
var c=此.controllerFor(“用户”);
返回c.get('content');
}
这有点老套,但还是……)
参见谢谢你的回答,你回答时我正在编辑。这个功能正是我想要避免的。我的实际用户项目的array controller是通过ajax加载其内容的,因此以这种方式设置模型在实践中是行不通的。我需要能够在观察者触发后通过ajax加载内容
。问题是模型
函数中的任何内容都是同步执行并存储在某处的,我没有办法更新或更改它。我在控制器上的观察者中尝试了这个.set('model')
,但没有效果。似乎指南引起了一些混乱。当它说“您可以通过实现setupControllers钩子来更改此行为”时,这意味着您可以从那里自定义控制器的内容,但覆盖setupController并不阻止模型回调。此外,模型回调设计用于异步代码,您描述的用例(通过ajax查找)正是ember数据的工作方式。更新我的答案以提供更多指导。太好了!我期待着。我甚至不反对学习和使用余烬数据,但是没有关于定制适配器的文档。只是含糊其辞地提到这是可以做到的。很遗憾,restful适配器对我不起作用。谢谢你的回答。关键是内容
根本不会被覆盖,也不会从路由设置内容。我认为设置控制器
是初始化内容的地方-这就是ember的工作方式。content
的初始值在某种程度上可以忽略不计。setupController
在每次路由到该控制器时都会被调用,因此在这种情况下,每次访问控制器时都会重新初始化所有内容。这意味着您每次都需要进行ajax调用、处理响应并填充内容。。。这太荒谬了。在使用内容设置模型(从编辑中)时,我实际上已经尝试过了,但是当模型获取内容时,内容是空白的。ajax稍后加载并填充内容。然后,当用户导航到该内容时,该内容将被擦除。我认为余烬的方式是,每次访问该路由时,控制器都会重新初始化。这包括设置模型。如果您使用ember数据,它将使用缓存结果,从而保存ajax调用,但您仍然需要重新填充内容。幸运的是,ember会自动执行此操作。
App.UsersRoute = Ember.Route.extend({
model: function() {
return ['mike', 'jen', 'sofia', 'greta']
}
}