通过使用 $resource 从 angular 调用 c# webservice 来设置控制器变量
Set controller variable by calling c# webservice from angular with the use of $resource
我在使用来自服务的 JSON 数据时遇到问题。
后端用c#写,前端用AngularJS.
我无法在 Angular 控制器中使用我想要的对象。
所以,这是我在 C#apirestful 中的服务
[Route("v1/environment")]
public IHttpActionResult GetEnvironment()
{
var env = new Environment(WebConfigurationManager.AppSettings["Env"]);
return this.Ok(env);
}
那么,这是我的 angular 服务:
module.factory('Environment', [
'$resource',
function ($resource) {
return $resource('/MorpheusApi/v1/environment', {}, {
getEnv: {method: 'GET', isArray: false}
});
}
]);
然后出于测试目的,我还创建了此服务:
module.factory('Env', [
'Environment',
function (Environment) {
return {
getEnv: function () {
var s = Environment.getEnv();
var e = angular.fromJson(s);
return e;
}
};
}
]);
然后我会像这样在控制器中使用它:
$scope.envLocal = Env.getEnv();
然后在ui,用这个
<p>Environment Local: {{envLocal}}</p>
<p>Environment Local Env: {{envLocal.Env}}</p>
我得到以下输出,我认为这很好:)
Environment Local: {"Env":"testText"}
Environment Local Env: testText
但是当我现在想说只提供从控制器到 ui 的 testText 时,我会做这样的事情:
var result = Env.getEnv();
$scope.envLocal = result.Env;
但是这不起作用..我也用 angular.toJson.. angular.fromJson 尝试过,但是我在 UI.. 中什么也没有得到。为什么?我如何在控制器中正确使用该对象,例如,如果我想在 if 或其他情况下使用它..
这可能吗?
我认为这是因为您试图在调用 getEnv 之后设置作用域变量。您可能必须使用 angular promise 才能做到这一点
这样的东西行得通吗?
var promise = Env.getEnv();
promise.then(function(res) {
$scope.envLocal = res.Env;
}, function(err) {});
您可能还需要将 $scope.envLocal
包装在 $apply
中,但不确定...
$scope.$apply(function () {
$scope.envLocal = res.Env;
});
你也可以这样写你的工厂,这样你就不需要写两个不同的服务了。
module.factory('Environment', ['$resource',
function ($resource) {
var api = $resource('/MorpheusApi/:action/:subaction', {}, {
getEnv: {
method: 'GET',
params: {
action: "v1",
subaction:"environment"
},
isArray: false
}
});
return {
getEnv: function () {
return api.getEnv().$promise;
}
};
}
]);
之后你只需要将这个服务注入到控制器中,你就可以轻松调用函数了。
Environment.getEnv()
.then(function (response) {
//If you wants to perform any logic on response object then you can do here and after that you can assign to scope variable
// You can write this logic in service too
$scope.envLocal = response;
});
您可以调用我上面提到的服务,因为 $resource 正在返回承诺,您的范围对象将在成功调用 api 时设置,而无需在此处调用 $scope.$apply()
。
假设你有两个不同的喜欢
/MorpheusApi/v1/environment
/MorpheusApi/v2/environment
您可以根据需要配置两条路由调用函数。
module.factory('Environment', ['$resource',
function ($resource) {
var api = $resource('/MorpheusApi/:action/:subaction', {}, {
getEnv: {
method: 'GET',
params: {
action: "v1",
subaction:"environment"
},
isArray: false
},
getEnvV2: {
method: 'GET',
params: {
action: "v2",
subaction:"environment"
},
isArray: false
}
});
return {
getEnv: function () {
return api.getEnv().$promise;
},
getEnvV2: function () {
return api.getEnvV2().$promise;
}
};
}
]);
有关配置和理解的更多信息,您可以阅读本文Explanation of configration and working of $resource
我在使用来自服务的 JSON 数据时遇到问题。 后端用c#写,前端用AngularJS.
我无法在 Angular 控制器中使用我想要的对象。
所以,这是我在 C#apirestful 中的服务
[Route("v1/environment")]
public IHttpActionResult GetEnvironment()
{
var env = new Environment(WebConfigurationManager.AppSettings["Env"]);
return this.Ok(env);
}
那么,这是我的 angular 服务:
module.factory('Environment', [
'$resource',
function ($resource) {
return $resource('/MorpheusApi/v1/environment', {}, {
getEnv: {method: 'GET', isArray: false}
});
}
]);
然后出于测试目的,我还创建了此服务:
module.factory('Env', [
'Environment',
function (Environment) {
return {
getEnv: function () {
var s = Environment.getEnv();
var e = angular.fromJson(s);
return e;
}
};
}
]);
然后我会像这样在控制器中使用它:
$scope.envLocal = Env.getEnv();
然后在ui,用这个
<p>Environment Local: {{envLocal}}</p>
<p>Environment Local Env: {{envLocal.Env}}</p>
我得到以下输出,我认为这很好:)
Environment Local: {"Env":"testText"}
Environment Local Env: testText
但是当我现在想说只提供从控制器到 ui 的 testText 时,我会做这样的事情:
var result = Env.getEnv();
$scope.envLocal = result.Env;
但是这不起作用..我也用 angular.toJson.. angular.fromJson 尝试过,但是我在 UI.. 中什么也没有得到。为什么?我如何在控制器中正确使用该对象,例如,如果我想在 if 或其他情况下使用它..
这可能吗?
我认为这是因为您试图在调用 getEnv 之后设置作用域变量。您可能必须使用 angular promise 才能做到这一点
这样的东西行得通吗?
var promise = Env.getEnv();
promise.then(function(res) {
$scope.envLocal = res.Env;
}, function(err) {});
您可能还需要将 $scope.envLocal
包装在 $apply
中,但不确定...
$scope.$apply(function () {
$scope.envLocal = res.Env;
});
你也可以这样写你的工厂,这样你就不需要写两个不同的服务了。
module.factory('Environment', ['$resource',
function ($resource) {
var api = $resource('/MorpheusApi/:action/:subaction', {}, {
getEnv: {
method: 'GET',
params: {
action: "v1",
subaction:"environment"
},
isArray: false
}
});
return {
getEnv: function () {
return api.getEnv().$promise;
}
};
}
]);
之后你只需要将这个服务注入到控制器中,你就可以轻松调用函数了。
Environment.getEnv()
.then(function (response) {
//If you wants to perform any logic on response object then you can do here and after that you can assign to scope variable
// You can write this logic in service too
$scope.envLocal = response;
});
您可以调用我上面提到的服务,因为 $resource 正在返回承诺,您的范围对象将在成功调用 api 时设置,而无需在此处调用 $scope.$apply()
。
假设你有两个不同的喜欢
/MorpheusApi/v1/environment
/MorpheusApi/v2/environment
您可以根据需要配置两条路由调用函数。
module.factory('Environment', ['$resource',
function ($resource) {
var api = $resource('/MorpheusApi/:action/:subaction', {}, {
getEnv: {
method: 'GET',
params: {
action: "v1",
subaction:"environment"
},
isArray: false
},
getEnvV2: {
method: 'GET',
params: {
action: "v2",
subaction:"environment"
},
isArray: false
}
});
return {
getEnv: function () {
return api.getEnv().$promise;
},
getEnvV2: function () {
return api.getEnvV2().$promise;
}
};
}
]);
有关配置和理解的更多信息,您可以阅读本文Explanation of configration and working of $resource