当从另一个控制器点击按钮时,更新第一个控制器的ng模型
Update ng-model of first controller on click of button from another controller
我有一个angularjs应用程序,我有两个控制器。我需要设置或更新第一个控制器输入字段的ng-模型通过使用第二个控制器的一个按钮的ng-click。由于第一个控制器的$scope不能从第二个控制器访问,所以可以使用$scope来完成。我尝试使用$rootScope。这是一个例子。
var myApp = angular.module('myApp',[]);
function MyCtrl1($scope, $rootScope) {
$rootScope.name = 'anonymous';
}
function MyCtrl2($scope, $rootScope) {
$scope.myclick = function()
{
$rootScope.name = "myname";
}
}
html代码
<div ng-controller="MyCtrl1">
<input type="text" ng-model="name" ng-change="ontxtchange(name)"></input>
</div>
<div ng-controller="MyCtrl2">
<button ng-click="myclick()">click</button>
</div>
如果我点击按钮ng-model得到更新。但是如果我在点击按钮之前对文本框做任何更改,那么$rootScope将不会更新ng-model。那么如何解决这个问题呢?
你可以使用$broadcast或$emit来决定你的控制器之间的关系。
如果你将使用$broadcast,你将在你的第二个控制器中有这样的内容:
$scope.myclick = function(){
$rootScope.$broadcast('eventName', 'myname');
})
在你的第一个控制器中:
$scope.$on('eventName', function(event, value) {
$scope.name = value;
});
使用$emit:
$scope.myclick = function(){
$rootScope.$emit('eventName', 'myname');
})
在你的第一个控制器中:
$scope.$on('eventName', function(event, value) {
$scope.name = value;
});
$broadcast——向下分派事件给所有子事件
$emit——向上调度事件
如果你的控制器之间没有关系,你可以使用$rootScope和$broadcast,在你的第二个控制器中,它看起来像这样:
$rootScope.$broadcast('eventName', value);
和在第一个控制器中:
$scope.$on('eventName', function(event, value) {
$scope.name = value;
});
你应该使用service,简单的与service共享值
JS:
angular.module("app",[])
.controller("ctrl1", ["$scope", "commonValues", function($scope, commonValues){
$scope.commonValues = commonValues;
}])
.controller("ctrl2", ["$scope", "commonValues",function($scope, commonValues){
$scope.changeValue = function(){
commonValues.testValue="value change";
}
}])
.service("commonValues", [function(){
this.testValue = "test";
}]);
HTML: <div ng-app="app">
<div ng-controller="ctrl1">{{commonValues.testValue}}</div>
<div ng-controller="ctrl2">
<button ng-click="changeValue()">Change</button>
</div>
</div>
http://codepen.io/anon/pen/PqVbYy 移除$rootScope
,使用正常的$scope
,然后为每个控制器注入新的服务。
(function () {
'use strict';
angular
.module('myApp', [])
.controller('MyCtrl1', MyCtrl1);
MyCtrl1.$inject = ['service'];
function MyCtrl1($scope, service) {
$scope.name = service.myScope;
}
})();
(function () {
'use strict';
angular
.module('myApp', [])
.controller('MyCtrl2', MyCtrl2);
MyCtrl2.$inject = ['service'];
function MyCtrl2($scope, service) {
$scope.myclick = function () {
service.myclick();
};
}
})();
(function () {
'use strict';
angular
.module('myApp')
.service('service', service);
service.$inject = [''];
function service() {
var self = this;
self.myScope = 'anonymous';
self.myclick = function () {
self.myScope = 'myname';
};
return self;
}
})();
相关文章:
- 而循环只设置php中输入字段中的第一个值
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 错误:$injector:modulerr模块错误(我的第一个SPA应用程序)
- IE11中的第二个调用取消了第一个Fetch API调用
- Javascript XMLHttpRequest——只有第一个POST请求有效
- 使用javascript或angularjs特定过滤器搜索字符串中第一个img标记的json值
- 将OnClick函数设置为<ul>,最后一个ul是擦除第一个ul-s
- RxJS油门行为;立即获取第一个值
- angularjs调用事件中控制器的一个函数
- Angular UI网格:如何通过第一个UI网格中的按钮使第二个UI网格可见
- 选择多个实例中的第一个
- 如何在调用下一个请求之前完成第一个Ajax Get请求
- Lodash:返回对象的第一个键,该对象的值(即数组)中有一个给定的元素(即字符串)
- 看起来第一个console.log是'It’不太对
- 与杜兰达尔合作的第一个JavaScript项目.尝试从第三方 API 获取数据
- 节点发布错误对象的第一个“属性”
- Javascript:表单验证getElementById仅返回第一个id元素
- 仅将 CSS 规则应用于
中的第一个 ,而不分配类/ID - JS在隐藏未定义的值后仅从数组中返回第一个id的值
- 获取行中的第一个值“;点击“;并传递给控制器