如何使用Ember.js实现服务层

如何使用Ember.js实现服务层,ember.js,Ember.js,我很好奇使用Ember.js实现服务层的最佳方法是什么。 A在《灰烬指南》中找不到任何关于它的建议。 例如,我有一些可以在多个控制器中使用的验证代码,我不想将它们复制粘贴到所有控制器中 您会将普通javascript对象与实现服务逻辑的方法一起使用,还是有一种更像ember的方法来实现这一点 谢谢。我认为目前重用控制器代码的最好方法是使用继承。。。也就是说,若您希望在多个控制器中使用公共代码,那个么创建一种抽象控制器,其中包含重复的逻辑,然后为其他控制器扩展该抽象控制器。这就是我过去所做的,对我

我很好奇使用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'});
});