Ember.js 使用ember model RESTAdapter时,绑定视图在保存时不会更新。
我正在探索使用余烬模型,作为我的ember.js应用程序中余烬数据的替代方案。我还没有足够的rep来创建一个新标记,但如果是这样,我会创建ember-model.js以避免混淆 所需的行为是显示一个简单的记录列表,并显示一个表单,以便使用GET和POST通过restfulrailsapi创建新记录 这与ember模型内的夹具适配器配合得很顺利。创建后,如预期的那样,新记录将推送到夹具阵列上,浏览器将自动更新以反映新记录 使用ReST适配器,我能够显示列表并创建新记录。但是,新创建的记录(绑定到模板)将不会更新,除非我点击浏览器上的“刷新”按钮。现在我想知道我可能做错了什么 在发布之前,我在StackOverflow和其他地方进行了挖掘。下一步我将深入研究资料来源,但我想我会询问是否有其他人有任何见解 谢谢大家,堆栈溢出的好人 这是我的app.js:Ember.js 使用ember model RESTAdapter时,绑定视图在保存时不会更新。,ember.js,Ember.js,我正在探索使用余烬模型,作为我的ember.js应用程序中余烬数据的替代方案。我还没有足够的rep来创建一个新标记,但如果是这样,我会创建ember-model.js以避免混淆 所需的行为是显示一个简单的记录列表,并显示一个表单,以便使用GET和POST通过restfulrailsapi创建新记录 这与ember模型内的夹具适配器配合得很顺利。创建后,如预期的那样,新记录将推送到夹具阵列上,浏览器将自动更新以反映新记录 使用ReST适配器,我能够显示列表并创建新记录。但是,新创建的记录(绑定到模
window.Dash = Ember.Application.create({
LOG_TRANSITIONS: true
});
Dash.Router.map(function() {
// put your routes here
this.resource('apps', function() {
this.route('add');
this.resource('app', { path: ':app_id' });
});
});
Dash.IndexRoute = Ember.Route.extend({
//temporary redirect to games list
redirect: function () {
this.transitionTo('apps');
}
});
Dash.AppsRoute = Ember.Route.extend({
model: function() {
return Dash.App.find();
}
});
Dash.AppsAddController = Ember.Controller.extend({
save: function() {
var name = this.get('name');
var id = this.get('id');
var account_id = this.get('account_id');
var auth_id = this.get('auth_id');
var state = Dash.AppState.selectedState;
var store_type = Dash.AppPlatform.selectedPlatform;
var store_app_id = this.get('store_app_id');
var download_url = this.get('download_url');
var newApp = Dash.App.create({
name: name,
id: id,
auth_id: auth_id,
state: state,
store_type: store_type,
store_app_id: store_app_id,
download_url: download_url
});
newApp.save();
}
});
Dash.AppPlatform = Ember.ArrayController.create({
selectedPlatform: null,
content: [
Ember.Object.create({id: 'itunes', name: 'iOS'}),
Ember.Object.create({id: 'android', name: 'Google Play'}),
Ember.Object.create({id: 'amazon', name: 'Amazon Appstore'}),
]
});
Dash.AppState = Ember.ArrayController.create({
selectedState: null,
content: [
Ember.Object.create({name: 'test'}),
Ember.Object.create({name: 'production'})
]
})
Dash.App = Ember.Model.extend({
id: Ember.attr(),
name: Ember.attr(),
auth_id: Ember.attr(),
state: Ember.attr(),
store_type: Ember.attr(),
store_app_id: Ember.attr(),
download_url: Ember.attr(),
});
Dash.App.adapter = Ember.RESTAdapter.create();
//hardcoding account id for now
Dash.App.url = 'http://localhost:3000/accounts/980190962/apps';
Dash.App.collectionKey = 'apps';
这是index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dashboard</title>
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<h2>Dashboard</h2>
<script type="text/x-handlebars" data-template-name="application">
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="apps">
{{#linkTo 'apps.add' }}Add an App{{/linkTo}}
<h3>Apps List</h3>
{{#if model}}
<ol>
{{#each model}}
<li>{{#linkTo 'app' this}}{{name}}{{/linkTo}}</li>
{{/each}}
</ol>
<div>{{outlet}}</div>
{{else}}
<p>You have no Apps.</p>
{{/if}}
</script>
<script type="text/x-handlebars" data-template-name="apps/index">
<p>Click a game to Edit or click Add to enter a new App.</p>
</script>
<script type="text/x-handlebars" data-template-name="app">
<div>
Name: {{name}}<br />
ID: {{id}}<br />
Account ID: {{account_id}}<br />
AuthID : {{auth_id}}<br />
Test Mode?: {{state}}<br />
Store Type: {{store_type}}<br />
Store App ID: {{store_app_id}}<br />
Download URL: {{download_url}}
</div>
</script>
<script type="text/x-handlebars" data-template-name="apps/add">
<p><label for="name">Name:</label><br />{{view Ember.TextField valueBinding='name'}}</p>
<p><label for="id">ID:</label><br />{{view Ember.TextField valueBinding='id'}}</p>
<p><label for="account_id">Account ID:</label><br />{{view Ember.TextField valueBinding='account_id'}}</p>
<p><label for="auth_id">Auth ID:</label><br />{{view Ember.TextField valueBinding='auth_id'}}</p>
<p><label for="state">Test Mode:</label><br />{{view Ember.Select contentBinding='Dash.AppState' valueBinding='Dash.AppState.selectedState' optionValuePath="content.name" optionLabelPath="content.name"}}</p>
<p><label for="store_type">Store Type:</label><br />{{view Ember.Select contentBinding='Dash.AppPlatform' valueBinding='Dash.AppPlatform.selectedPlatform' optionValuePath="content.id" optionLabelPath="content.name"}}</p>
<p><label for="store_app_id">Store App ID:</label><br />{{view Ember.TextField valueBinding='store_app_id'}}</p>
<p><label for="download_url">Download URL:</label><br />{{view Ember.TextField valueBinding='download_url'}}</p>
<p><button {{action 'save'}}>Save</button></p>
</script>
<script src="js/libs/jquery-1.9.1.js"></script>
<script src="js/libs/handlebars-1.0.0-rc.4.js"></script>
<script src="js/libs/ember-1.0.0-rc.6.js"></script>
<script src="js/libs/ember-model.js"></script>
<script src="js/app.js"></script>
</body>
</html>
它不会自动以这种方式工作。AppState控制器中的内容数组只是一个包含项的静态数组。你必须这样做 此.controllerFor'Apps'.get'content'.pushObjectnewApp以查看它在UI中的反映
您的应用程序控制器将是ArrayController,因为应用程序路由的模型函数返回了一个数组。它不会自动以这种方式工作。AppState控制器中的内容数组只是一个包含项的静态数组。你必须这样做 此.controllerFor'Apps'.get'content'.pushObjectnewApp以查看它在UI中的反映
您的应用程序控制器将是ArrayController,因为应用程序路由的model函数返回了一个数组。要继续此操作:在这种情况下,绑定视图应在调用record.didCreateRecord时更新。这将告诉Ember操作已成功完成,然后IIRC、run循环将任务排队以更新视图。无论出于何种原因,ember-model.js中的重启适配器在没有调用record.didCreateRecord的情况下完成。我不明白为什么。我最终使用jQuery编写了自己的适配器。这比我预期的要容易得多,不过我相信我会发现在这一过程中可能遗漏了一些步骤。接下来:在这种情况下,绑定视图应该在调用record.didCreateRecord时更新。这将告诉Ember操作已成功完成,然后IIRC、run循环将任务排队以更新视图。无论出于何种原因,ember-model.js中的重启适配器在没有调用record.didCreateRecord的情况下完成。我不明白为什么。我最终使用jQuery编写了自己的适配器。这比我预期的要容易得多,尽管我相信我会发现在这一过程中我可能错过了一些步骤。