Angular Js服务返回函数/对象?

时间:2016-05-31 10:03:16

标签: angularjs return angularjs-service angularjs-provider

根据角度js docs

服务(名称,构造函数); 名称:名称 构造函数:将被实例化的可注入类(构造函数)。

Internally :
{
  $get: function() {
    return $injector.instantiate(constructor);
  }
}
  

可以从角度文档得出结论,服务对待   作为构造函数和提供者传递的第二个参数创建一个实例   通过$ injector并通过$ get返回。所以每当我们注射   我们任何模块功能中的服务(控制器,指令   等)它应该返回新创建的Singleton对象   offcourse。

如果我像这些方式定义我的服务,问题就来了。

1. _app_user_content.service("MyService" , function(){
        this.Message = "Greetings!";
    });  //returns object when injected.
2. _app_user_content.service("MyService" , function(){
        this.Message = "Greetings!";
        return "123"
    }); // returns object  when injected.
3. _app_user_content.service("MyService" , function(){
        this.Message = "Greetings!";
        return function(){}
    }); //returns function(){}  when injected. Doesnot return object

为什么第三种情况会返回一个函数?

1 个答案:

答案 0 :(得分:2)

这是一个JavaScript的东西,不仅仅是一个有角色的东西。

角度service的作用基本上是通过执行new SomeObject()SomeObject作为构造函数来使用你的函数,function potato() {this.yummy = true; return function() {};} function tomato() {this.yummy = true;} console.log(new potato()); console.log(new tomato()); 是你在第二个参数中定义的函数(重要的是要注意在JavaScript函数中)是对象)。

如果你的函数没有返回任何值或原始值,构造函数将忽略你的返回值,而是返回你在该函数的作用域(this)上设置的任何内容。但是,如果返回一个对象,则构造函数似乎将返回该对象。 (谢谢@ajaykumar)

在浏览器控制台中试试......

function () {}

你应该看到马铃薯归来{yummy: true}

您应该看到番茄返回new SomeObject()

对于像这样的构造函数,我建议不要返回任何内容。

但是,如果你使用角度factory方法,你会发现return SomeObject()角度不会new android.support.v7.preference.DialogPreference;,在这种情况下你想要返回一个DialogPreference.具有您要在服务中公开的任何函数/参数的对象。

有关JavaScript import android.content.Context; import android.support.v7.preference.DialogPreference; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.ToggleButton; public class TogglePreferenceTest extends DialogPreference { public TogglePreferenceTest(Context context) { super(context); } public TogglePreferenceTest(Context context, AttributeSet attrs) { super(context, attrs); } public TogglePreferenceTest(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public View getView(View convertView, ViewGroup parent) { if (convertView == null) { convertView = new LinearLayout(getContext()); ((LinearLayout) convertView) .setOrientation(LinearLayout.HORIZONTAL); TextView txtInfo = new TextView(getContext()); txtInfo.setText("Test"); ((LinearLayout) convertView).addView(txtInfo, new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1)); ToggleButton btn = new ToggleButton(getContext()); ((LinearLayout) convertView).addView(btn); } return convertView; } } 关键字,原型和构造函数here的更多信息。