- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我偶然发现了一个应该是常见且明显的问题,但我似乎无法解决这个问题。
我正在开发一个小型原型(prototype)应用程序。我的后端开发人员在 JSON 对象中为我提供了配置文件数据。比方说,它看起来像这样:
profile = {Name: 'John', Email: 'john@mail.com', DOB: '1980-11-03'}
我需要在多个位置使用这些值,而且我也不想在 Controller 中放置后端 http 调用,所以我创建了一个服务来处理这个问题:
angular.module('app', [])
.service('ProfileService', ['$http', function ($http) {
var service = this;
service.Name = null;
service.Email = null;
service.DOB = null;
service.getProfile = function () {
return $http.get('/profile').then(function (response) {
service.Name = response.data.Name;
service.Email = response.data.Email;
service.DOB = response.data.DOB;
return true;
});
};
return service;
}])
.controller('ProfileCtr', ['ProfileService', function (service) {
var vm = this;
service.getProfile().then(function () {
vm.Name = service.Name;
vm.Email = service.Email;
vm.DOB = service.DOB;
});
}]);
这个解决方案有很多问题:
一个解决方案是添加一个间接层并在服务中创建一个对象:
angular.module('app', [])
.service('ProfileService', ['$http', function ($http) {
var service = this;
service.profile = {};
service.getProfile = function () {
return $http.get('/profile').then(function (response) {
for (key in response.data) {
service.profile[key] = response.data[key];
};
return true;
});
};
return service;
}])
.controller('ProfileCtr', ['ProfileService', function (service) {
var vm = this;
service.getProfile().then(function () {
vm.profile = service.profile;
});
}]);
这通常有效,但现在我得到了笨拙的 controllerAs 语法:
<div ng-controller="ProfileCtr as ctr">
<h1> {{ ctr.profile.Name }}</h1>
<p> Email: {{ ctr.profile.Email }} <br /> DOB: {{ ctr.profile.DOB }}</p>
</div>
我想知道是否有一种方法可以同时满足我:干净的 HTML {{ ctr.Name }}
语法 和 一种 DRY 编程风格。
感谢任何提示!
最佳答案
我觉得你想要的不止于此,但对我来说这至少是干的:
angular.module('app', [])
.service('ProfileService', ['$http', function ($http) {
var service = this;
service.getProfile = function () {
return $http.get('/profile').then(function (response) {
return response.data;
});
};
return service;
}])
.controller('ProfileCtr', ['ProfileService', function (ProfileService) {
var vm = this;
ProfileService.getProfile().then(function (profile) {
vm.profile= profile;
});
}]);
服务获取数据。您也可以在此处添加缓存功能。 Controller 使用服务来获取数据。没有重复代码。
我喜欢使用 $scope
变量,它可以消除一层间接问题。但是,controllerAs 确实有它的优势,特别是如果您使用嵌套 Controller 并且想要弄清楚您使用的是哪个 Controller 。 $scope
标识符将在版本 2 中删除。
为这部分 html 使用指令而不是 Controller 应该使您的代码更易于阅读和重用。还建议做好升级到版本 2 的准备。
然后:
app.directive('isolateScopeWithControllerAs', function () {
var controller = ['ProfileService', function (ProfileService) {
var vm = this;
ProfileService.getProfile().then(function (profile) {
vm.profile= profile;
});
}];
return {
restrict: 'EA', //Default for 1.3+
controller: controller,
controllerAs: 'vm',
bindToController: true, //required in 1.3+ with controllerAs
templateUrl: // path to template
};
});
然后你的 HTML 仍然给你:
<h1> {{ vm.profile.Name }}</h1>
<p> Email: {{ vm.profile.Email }} <br /> DOB: {{ vm.profile.DOB }}</p>
ProfileCtr as vm
如果您对多个对象使用该指令,则将有更多用处。例如,如果您有一个用户指令,那么您可以:
controllerAs: 'user',
使用 user.profile.name
和 ng-repeat='friend in user.friends'
等
关于javascript - AngularJS - 使用 controllerAs 语法和服务属性的 DRY 双向数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30912547/
我使用 plunker 中的范围创建了一个 d3 条形图指令 http://plnkr.co/edit/yF8H9i8tyu1o2xJCN9bV Controller 的范围内有 chartData。
我正在编写 AngularJS 教程,我看到以下代码: .state('index',{ url:"/", templateUrl:"views/index.html", controll
我正在尝试遵循 John Papa 的 angularJS 风格指南 here并开始将我的指令切换为使用 controllerAs。但是,这是行不通的。我的模板似乎无法访问分配给 vm 的任何内容。请
我是 Angular 新手,想使用 ui-bootstrap 来使用模态(弹出表单)来自 Angular 。我正在学习Angular bootstrap site 。可以看出,它利用了Controll
我有几个嵌套指令。我试图保持一致并使用 controllerAs 语法。但是我正在努力寻找一种干净的方法让 children 调用父方法,该方法不包括父方法在其范围内放置看似随机的函数。 angula
我需要的是根据通过 HTML 元素属性值传递给该指令的值将数据注入(inject)指令内,该元素动态变化. 这是我的代码: angular.module('test', []) .contro
据我所知,在“指令定义对象”上使用 Controller 属性会在每次链接给定指令时创建该 Controller 的单独实例吗? 现在玩 controllerAs patterns 我可以看到,当每个
在 AngularJS 中使用 controllerAs 语法时,为 ng-click 等定义处理程序的最佳位置是什么?在 Controller 上还是在作用域上(在链接函数中定义)? 那么,你使用:
我实际上正在创建一个小指令,但我正面临范围对象和 controllAs 的问题。 事实上,我有这样的结果: angular.module('app') .directive('historyConne
我的网络应用程序有几个页面,它们都有自己的 Controller 。在这些页面中,我使用也有 Controller 的指令。所有 Controller 都使用 controllerAs 语法,它们都设
我目前有一个使用父 Controller 范围内属性的指令: .controller('MainCtrl', function($scope) { $scope.name = 'My Name';
我无法使用 controllerAs 语法/样式从这里访问指令的独立作用域变量。 我可以使用 $scope 访问变量,但这似乎并不一致。有没有办法使用 this 访问隔离作用域的变量? 这是一个 gi
最近我一直在使用 ControllerAs 语法,但我不确定如何能够在 $watch 中从 Controller 更改模型。 我的 watch 是这样的: $scope.$watch(angular.
嘿,我是 angularjs 的新手,我在 angularjs 中使用 controlleras 样式,因为代码是可呈现的和网络的。我的问题是在 Controller 中调用子函数我的代码如下 //
有人告诉我,controllerAs 模式通过在作用域上附加更少的东西来提高 AngularJS 应用程序的性能。 我真的不明白这是怎么发生的,因为 Controller 本身在范围内公开了它的属性。
我在 html 代码中有这个: {{ ::schema.name }} Empty 问题是,使用此语法时我看不到任何结果 - 如果未填充过滤器,则应显示 10 个结果。 注意:
正如标题所示,我在使用嵌套自定义指令的 Angular 项目上遇到了一些问题。我正在创建一个界面,允许用户通过单击复选框来过滤搜索结果的 JSON 提要。指令模板层次结构如下: 我似乎能
这是我的代码: //HTML {{foo.name}} //脚本 app.directive('myDirective', function() { return { restr
我使用 controllerAs 语法来避免在我的 Controller 中出现 $scope soup,并且还使用 ui.bootstrap 来呈现模态视图。 我需要打开一个与当前 Controll
嗨,我有 StudentController如下, function StudentController($scope,StudentService){ $scope.student = St
我是一名优秀的程序员,十分优秀!