angularjs:一个指令在另一个指令中,继承或共享它';s隔离范围
问题的根源是:我想创建一个指令来自动处理字段检查,结果应该是这样的:angularjs:一个指令在另一个指令中,继承或共享它';s隔离范围,angularjs,scope,angularjs-directive,nested,share,Angularjs,Scope,Angularjs Directive,Nested,Share,问题的根源是:我想创建一个指令来自动处理字段检查,结果应该是这样的: <div field-check="check.item_name"> <span>Item Name:</span> <input type='text' ng-model="item.item_name" /> <error-message>ITEM NAME INVALID!</error-message> </div&
<div field-check="check.item_name">
<span>Item Name:</span>
<input type='text' ng-model="item.item_name" />
<error-message>ITEM NAME INVALID!</error-message>
</div>
app.directive 'fieldCheck', () ->
restrict: "A"
scope:
'check': '=fieldCheck'
controller: ($scope, $element) ->
model_elem = search_ng_model_elem($element[0])
model_name = model_elem.attributes.getNamedItem('ng-model').value
angular.element(model_elem).scope().$watch model_name, ((data) ->
$scope.valid = $scope.check(data) ### 'valid' is the value I want to set to [the shared scope]
), true
$scope: $scope
link: (scope, element, attrs, controller) ->
scope.message: "error!"
app.directive 'errorMessage', () ->
require: '^fieldCheck'
restrict: "E"
template: '<p ng-class="{hide: valid}" ng-bind="message"></p>' ### 'valid' is the value I want to get
link: (scope, element, attrs, controller) ->
scope.message = element.text() or '??????'
alert scope is controller.$scope.$parent
项目名称:
项目名称无效!
所以我创建了两个指令:filedCheck和errorMessage,第二个指令需要第一个指令。
我的原产地代码如下:
(->
app.directive 'fieldCheck', () ->
search_ng_model_elem = (element) ->
if element.attributes?
if element.attributes.getNamedItem('ng-model')
return element
if element.children?.length
for e in element.children
r = search_ng_model_elem(e)
return r if r?
priority: 0
restrict: "A"
replace: false
scope:
'check': '=fieldCheck'
controller: ($scope, $element) ->
$scope.valid = true
model_elem = search_ng_model_elem($element[0])
alert 'directive: fieldCheck compile error (ng-model not found) !' if not model_elem?
model_name = model_elem.attributes.getNamedItem('ng-model').value
if not $scope.check?
alert 'check func not found!'
else
angular.element(model_elem).scope().$watch model_name, ((data) ->
$scope.valid = $scope.check(data)
), true
$scope: $scope
link:
post: (scope, element, attrs, controller) ->
scope.error = message: "error!"
app.directive 'errorMessage', () ->
priority: 2
require: '^fieldCheck'
restrict: "E"
template: '<p class="txt-alert" ng-class="{hide: valid}" ng-bind="message"></p>'
#scope:
# 'message': '=message'
replace: false
link:
post: (scope, element, attrs, controller) ->
scope.message = element.text() or '??????'
alert scope is controller.$scope.$parent
)()
(->
应用程序指令“现场检查”,()->
搜索模式元素=(元素)->
如果元素为.attributes?
if element.attributes.getNamedItem('ng-model'))
返回元素
if元素。子元素?长度
对于元素中的e.children
r=搜索模型元素(e)
如果返回r,则返回r?
优先级:0
限制:“A”
替换:false
范围:
“检查”:“=字段检查”
控制器:($scope$element)->
$scope.valid=true
模型元素=搜索模型元素($element[0])
警报“指令:现场检查编译错误(未找到ng模型)!”如果不是模型元素?
model_name=model_elem.attributes.getNamedItem('ng-model')。值
如果不是$scope.check?
警报“未找到检查函数!”
其他的
angular.element(model_elem).scope().$watch model_name,((数据)->
$scope.valid=$scope.check(数据)
)是的
$scope:$scope
链接:
post:(范围、元素、属性、控制器)->
scope.error=消息:“错误!”
app.directive'errorMessage',()->
优先事项:2
要求:“^fieldCheck”
限制:“E”
模板:''
#范围:
#“消息”:“=消息”
替换:false
链接:
post:(范围、元素、属性、控制器)->
scope.message=element.text()或“??”
警报范围为控制器。$scope.$parent
)()
为了便于阅读,我简化了代码,使其如下所示:
<div field-check="check.item_name">
<span>Item Name:</span>
<input type='text' ng-model="item.item_name" />
<error-message>ITEM NAME INVALID!</error-message>
</div>
app.directive 'fieldCheck', () ->
restrict: "A"
scope:
'check': '=fieldCheck'
controller: ($scope, $element) ->
model_elem = search_ng_model_elem($element[0])
model_name = model_elem.attributes.getNamedItem('ng-model').value
angular.element(model_elem).scope().$watch model_name, ((data) ->
$scope.valid = $scope.check(data) ### 'valid' is the value I want to set to [the shared scope]
), true
$scope: $scope
link: (scope, element, attrs, controller) ->
scope.message: "error!"
app.directive 'errorMessage', () ->
require: '^fieldCheck'
restrict: "E"
template: '<p ng-class="{hide: valid}" ng-bind="message"></p>' ### 'valid' is the value I want to get
link: (scope, element, attrs, controller) ->
scope.message = element.text() or '??????'
alert scope is controller.$scope.$parent
app.directive'fieldCheck',()->
限制:“A”
范围:
“检查”:“=字段检查”
控制器:($scope$element)->
模型元素=搜索模型元素($element[0])
model_name=model_elem.attributes.getNamedItem('ng-model')。值
angular.element(model_elem).scope().$watch model_name,((数据)->
$scope.valid=$scope.check(data)####“valid”是我要设置为[共享范围]的值
)是的
$scope:$scope
链接:(范围、元素、属性、控制器)->
scope.message:“错误!”
app.directive'errorMessage',()->
要求:“^fieldCheck”
限制:“E”
template:“”###“valid”是我要获取的值
链接:(范围、元素、属性、控制器)->
scope.message=element.text()或“??”
警报范围为控制器。$scope.$parent
问题是,“scope是controller.$scope.$parent”返回true,这意味着我从指令errorMessagee的link函数获得的范围不是我将数据放入的$scope,而是父级。这就是问题所在:如何使这些指令共享同一范围?这是一个有趣的问题,但您能否格式化它并删除与问题代码无关的内容?