如何使用Ember.js实现服务层
我很好奇使用Ember.js实现服务层的最佳方法是什么。 A在《灰烬指南》中找不到任何关于它的建议。 例如,我有一些可以在多个控制器中使用的验证代码,我不想将它们复制粘贴到所有控制器中 您会将普通javascript对象与实现服务逻辑的方法一起使用,还是有一种更像ember的方法来实现这一点如何使用Ember.js实现服务层,ember.js,Ember.js,我很好奇使用Ember.js实现服务层的最佳方法是什么。 A在《灰烬指南》中找不到任何关于它的建议。 例如,我有一些可以在多个控制器中使用的验证代码,我不想将它们复制粘贴到所有控制器中 您会将普通javascript对象与实现服务逻辑的方法一起使用,还是有一种更像ember的方法来实现这一点 谢谢。我认为目前重用控制器代码的最好方法是使用继承。。。也就是说,若您希望在多个控制器中使用公共代码,那个么创建一种抽象控制器,其中包含重复的逻辑,然后为其他控制器扩展该抽象控制器。这就是我过去所做的,对我
谢谢。我认为目前重用控制器代码的最好方法是使用继承。。。也就是说,若您希望在多个控制器中使用公共代码,那个么创建一种抽象控制器,其中包含重复的逻辑,然后为其他控制器扩展该抽象控制器。这就是我过去所做的,对我来说非常有效 不过,我在路由器方面也遇到过类似的问题。你也可以随时使用混合器 例如:
App.MyAbstractController = Em.Controller.extend({
commonMethod: function() {
// something common to all controllers
}
})
App.ActualControllerOne = App.MyAbstractController.extend();
App.ActualControllerTwo = App.MyAbstractController.extend();
在Emberjs中有对服务层的内置支持,甚至现在还没有文档记录。您可以使用基于依赖项注入的服务层 见下面的例子。还有 index.html
<!doctype html>
<html lang="en" data-framework="emberjs">
<head>
<meta charset="utf-8">
<title>ember_js_di_example</title>
<script src="./bower_components/jquery/dist/jquery.js"></script>
<script src="./bower_components/handlebars/handlebars.js"></script>
<script src="./bower_components/ember/ember.js"></script>
<script src="./index.js"></script>
</head>
<body>
<script type="text/x-handlebars" id="Home">
<div>
<div>My name is <b>{{me.name}}</b></div>
<div>My wife name is <b>{{me.wife.name}}</b></div>
<div>My wife name is <b>{{wife.name}}</b> (based on controller injection)</div>
<div>My children name is <b>{{me.children.name}}</b></div>
</div>
</script>
<script type="text/x-handlebars">
{{ outlet }}
</script>
汤姆·戴尔最近在推特上说,他想提出一个最好的方法来做这件事——好吧,这是个好主意,所以我接受了。然而,我仍然认为,服务层可能是有用的。没有什么可以阻止你创建自己的对象,并在它们之间代理东西。。。那会让你做一个服务。。。不过,控制器几乎可以处理装饰器包装的模式,因此您也可以从具有所需功能的控制器继承,或者使用单独的控制器作为服务功能的代理对象。这很容易。
var Services = Ember.Namespace.create();
// service class one
Services.Me = Ember.Object.extend({
name: function () {
return 'Jan'
}.property()
})
// service class two
Services.Wife = Ember.Object.extend({
name: function () {
return 'Sarka'
}.property()
})
// service class three
Services.Children = Ember.Object.extend({
name: function () {
return 'Ondra'
}.property()
})
App = Ember.Application.create({
LOG_TRANSITIONS: true,
ready: function () {
// Register service class - instance will be created on demand
this.register('service:me', Services.Me);
this.register('service:wife', Services.Wife);
// Register already instantiated service
this.register('service:children', Services.Children.create(), {instantiate: false});
// inject service to all routes, controllers, service will be accessible as me property
this.inject('route', 'me', 'service:me');
this.inject('controller', 'me', 'service:me');
// inject wife and children to me, will be accessible as wife and children property
this.inject('service:me', 'wife', 'service:wife');
this.inject('service:me', 'children', 'service:children');
// inject wife only to application controller, will be accessible as wife property on home controller
this.inject('controller:Home', 'wife', 'service:wife')
}
});
App.Router.map(function () {
this.resource('Home', {path: '/home'});
});