Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
angularjs:一个指令在另一个指令中,继承或共享它';s隔离范围_Angularjs_Scope_Angularjs Directive_Nested_Share - Fatal编程技术网

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,而是父级。这就是问题所在:如何使这些指令共享同一范围?

这是一个有趣的问题,但您能否格式化它并删除与问题代码无关的内容?