从指令更新控制器范围变量
Updating controller scope variable from directive
我想通过包含其内容来创建一个行为类似于容器的指令。我的 html 看起来像这样
<test>
<input type="text" ng-model="name" />
<button ng-click="alertName()">Alert</button>
</test>
控制器和指令是这样的
angular.module('app', [])
.controller('TestCtrl', function($scope) {
$scope.name = 'Eric Cartman';
$scope.alertName = function() {
alert($scope.name);
};
})
.directive('test', function() {
return {
restrict: 'E',
template: '<div ng-transclude></div>',
transclude: true,
replace: true,
link: function($scope, elem, attr, ctrl) {
}
};
});
当页面加载时,我在文本框中看到 'Eric Cartman',当我单击 'Alert' 按钮时,我在对话框中看到 'Eric Cartman'。到这里一切都很好。
问题是当我在文本框中更改名称并点击 'Alert' 按钮时它仍然提示 'Eric Cartman'。我哪里错了?
这是由于范围的原型继承和绑定变量是 "top level"(即 ng-model="name"
,而不是 ng-model="model.name"
)。
只需将值包装在一个对象中:
// controller:
$scope.model = { name: 'Eric Cartman' };
// do not forget the alert!
当然要绑定好:
<input type="text" ng-model="model.name" />
原型继承是一个初接触人会比较迷惑的话题;我什至没有尝试在这里解释这个概念,网络上有很多资源。您可以研究它或相信我的话,永远不要使用 "top-level" 双向绑定!
我想通过包含其内容来创建一个行为类似于容器的指令。我的 html 看起来像这样
<test>
<input type="text" ng-model="name" />
<button ng-click="alertName()">Alert</button>
</test>
控制器和指令是这样的
angular.module('app', [])
.controller('TestCtrl', function($scope) {
$scope.name = 'Eric Cartman';
$scope.alertName = function() {
alert($scope.name);
};
})
.directive('test', function() {
return {
restrict: 'E',
template: '<div ng-transclude></div>',
transclude: true,
replace: true,
link: function($scope, elem, attr, ctrl) {
}
};
});
当页面加载时,我在文本框中看到 'Eric Cartman',当我单击 'Alert' 按钮时,我在对话框中看到 'Eric Cartman'。到这里一切都很好。
问题是当我在文本框中更改名称并点击 'Alert' 按钮时它仍然提示 'Eric Cartman'。我哪里错了?
这是由于范围的原型继承和绑定变量是 "top level"(即 ng-model="name"
,而不是 ng-model="model.name"
)。
只需将值包装在一个对象中:
// controller:
$scope.model = { name: 'Eric Cartman' };
// do not forget the alert!
当然要绑定好:
<input type="text" ng-model="model.name" />
原型继承是一个初接触人会比较迷惑的话题;我什至没有尝试在这里解释这个概念,网络上有很多资源。您可以研究它或相信我的话,永远不要使用 "top-level" 双向绑定!