【问题标题】:Isolate scope - Value defined inside directive scope alone must perform change隔离范围 - 仅在指令范围内定义的值必须执行更改
【发布时间】:2016-04-07 06:19:42
【问题描述】:

我正在尝试隔离自定义指令的范围。

一个具有挑战性的问题我咨询了许多开发人员,但到目前为止我没有得到答案。

请从 Link 的 JS Fiddle 中找到代码,并帮助我更正我应该做出哪些更改才能让这个东西正常工作。

指令模板内有一个按钮,名为My Reverse "点击按钮时,我想更改指令模板内的文本值而不影响父值**"

期待对提供的 Fiddle 代码进行更正。Requesting correction to this code sample in JS FIDDLE

更具体的说明:

当我点击父按钮我想影响指令文本框值但是当我点击指令的按钮时我希望只影响指令文本框不是父文本框 值。


    app.directive("myDirective", function() {

  return {
    restrict: "EA",
    scope: {
      name: "@",
      color: "=",
      reverse: "&"
    },
    template: [
      "<div class='line'>",
      "Name : <strong>{{name}}</strong>;  Change name:<input type='text' ng-model='name' /><br/>",
      "<br/>When I click 'My Reverse' Button, name given inside 'Directive scope' alone must perform reverse operation & not Name inside Parent scope : <input type='button' ng-click='myReverse()' value='My Reverse'/>",
      "</div><div class='line'>",
      "Color : <strong style='color:{{color}}'>{{color|uppercase}}</strong>;  Change color:<input type='text' ng-model='color' /><br/></div>",
      "<br/><input type='button' ng-click='reverse()' value='Reverse Name'/>"
    ].join("")
  };

等待解决方案..请任何人帮助我..将非常感谢

【问题讨论】:

  • 当你点击父按钮时,你想影响指令文本框,但是当你点击指令按钮时,你只想影响指令文本框,对吗?
  • 是的,这正是我的要求——感谢您理解亲爱的西奥……我应该为此做些什么改变……你能验证并纠正我的 JSFIDDLE
  • 等待解决方案..请任何人帮助我
  • 我通过单击“我的反向”按钮进行了检查。该值没有改变或反转请检查Please check this JS FIDDLE
  • 请看一下我的解决方案。请忽略我的控制台日志

标签: javascript angularjs angularjs-directive isolate-scope


【解决方案1】:

我有另一个解决方案。

jsfiddle 上的实时示例。

var app = angular.module("app", []);

app.controller("MainCtrl", function($scope) {
  $scope.name = "Harry";
  $scope.color = "#333333";
  $scope.getReverseName = function(name) {
    console.log('getReverseName', name);
    return name ? name.split("").reverse().join("") : name;
  };
  $scope.reverseName = function() {
    $scope.name = $scope.getReverseName($scope.name);
  };
  $scope.randomColor = function() {
    $scope.color = '#' + Math.floor(Math.random() * 16777215).toString(16);
  };
});

app.directive("myDirective", function() {

  return {
    restrict: "EA",
    scope: {
      name: "@",
      color: "@",
      reverse: "&"
    },
    template: [
      "<div class='line'>",
      "Name : <strong>{{name}}</strong>;  Change name:<input type='text' ng-model='name' /><br/>",
      "<br/>When I click 'My Reverse' Button, name given inside 'Directive scope' alone must perform reverse operation & not Name inside Parent scope : <input type='button' ng-click='myReverse()' value='My Reverse'/>",
      "</div><div class='line'>",
      "Color : <strong style='color:{{color}}'>{{color|uppercase}}</strong>;  Change color:<input type='text' ng-model='color' /><br/></div>",
      "<br/><input type='button' ng-click='reverse()' value='Reverse Name'/>"
    ].join(""),
    link: function(scope) {
      scope.myReverse = function() {
        console.log(scope.name);
        scope.name = scope.reverse({
          name: scope.name
        });
      }
    }
  };
});
.parent {
  border: 20px solid #676767;
  padding: 20px;
}
.parent,
.directive {
  position: relative;
}
.parent:after,
.directive:after {
  display: inline;
  color: #fff;
  font-size: normal;
  position: absolute;
  top: -20px;
  left: -20px;
  z-index: 100;
  padding: 1px 5px;
  background-color: rgba(0, 0, 0, 0.5);
}
.parent:after {
  content: "MainCtrl or Parent Scope";
}
.directive {
  padding: 20px;
  border: 20px solid #cbccdd;
  margin-top: 20px;
}
.directive:after {
  content: "Directive Scope"
}
.line {
  border-bottom: 1px dotted #ccc;
  padding: 5px 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">

  <div class="parent" ng-controller="MainCtrl">
    <div class="line">
      Name inside parent scope is: <strong>{{name}}</strong>
      <input type="button" ng-click="reverseName()" value="Reverse name" />
    </div>
    <div class="line">
      Color inside parent scope is: <strong style="color:{{color}}">{{color|uppercase}}</strong>
      <input type="button" ng-click="randomColor()" value="Randomize color" />
    </div>
    <div class="directive" my-directive name="{{name}}" color="{{color}}" reverse="getReverseName(name)"></div>
  </div>
</div>

【讨论】:

  • 很酷的东西,就像角度方式一样简单。非常感谢@Stepan
【解决方案2】:

我更改了您的代码,以便您可以通过按“Reverse Name”按钮将值从父控制器传递到指令,并通过按“My Reverse”按钮使“名称反向”,不影响父控制器。

我添加了 Link 函数参数,并在其中创建了 myReverseD() 函数,当您单击“我的反向”按钮时会调用该函数。

所以在你的指令中你有:

app.directive("myDirective", function() {

  return {
    restrict: "EA",
    scope: {
      name: "@",
      color: "@",
      reverse: "&"
    },
    template: [
      "<div class='line'>",
      "Name : <strong>{{name}}</strong>;  Change name:<input type='text' ng-model='name' id='nametxt'/><br/>",
      "<br/>On button click 'My Reverse', I want to reverse text value which is there inside  directive template of isolate scope without affecting the above defined parent Name in Parent scope : <input type='button' ng-click='myReverseD($event)' value='My Reverse'/>",
      "</div><div class='line'>",
      "Color : <strong style='color:{{color}}'>{{color|uppercase}}</strong>;  Change color:<input type='text' ng-model='color' /><br/></div>",
      "<br/><input type='button' ng-click='reverse()' value='Reverse Name'/>"
    ].join(""),
     link: function (scope, element, attrs) {
               console.log(scope.name,scope.color);

               scope.myReverseD = function($ev){

                    var nametxt = document.getElementById('nametxt');
                    console.log($ev);
                    console.log('reverse',nametxt,nametxt.value);

                   nametxt.value = nametxt.value.split("").reverse().join("");       
               }
            }
  };

JSFIDDLE:http://jsfiddle.net/own7kbru/7/

希望有所帮助,祝你好运。

【讨论】:

  • 亲爱的西奥,你太棒了。你拯救了我的一天。很困惑现在我也知道了Link函数的真正用途。说真的,你是一位伟大的老师。非常感谢。向你致敬。
  • 为什么你使用document.getElementById('nametxt')而不是scope.name
  • 当我观看第二个解决方案时,我注意到指令中的底部按钮“反向名称”不起作用,你可以接受 Naresh Raj 吗?因为在我的解决方案上它可以工作(它改变了控制器和指令的输入)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多