【问题标题】:Change Controller variable value from change in isolate scope directive从隔离范围指令的更改中更改控制器变量值
【发布时间】:2014-04-06 20:14:44
【问题描述】:

所以我知道通过两种方式绑定=,在指令中可以将控制器的值传递到指令中。但是如何将隔离指令中的更改传递回控制器?

例如,我有一个表单,它有一个滑块,该滑块是由一个具有隔离范围的指令构建的。从控制器设置初始值,然后在具有隔离范围的指令中更改。

我要做的是在具有两种方式绑定的指令变量也发生更改时更改控制器的值。

有什么建议吗?

【问题讨论】:

  • 这是默认完成的。为您的问题创建一个 plunker,以便我们提供更好的帮助。
  • 好的,可能需要一些时间。但问题是,当从视图之外的任何其他地方调用该变量时,它不会改变。
  • 问题是当表单提交函数被调用时,或者变量被引用到除了直接在视图中显示之外的任何地方都不会改变。

标签: javascript angularjs validation angularjs-directive angularjs-scope


【解决方案1】:

您有两种可能的方式来实现这一目标。一种是在控制器中针对您传递到指令隔离范围的变量创建一个监视语句。

// code in view controller
$scope.sliderValue = 0;
$scope.$watch('sliderValue', function(newValue) {
  if (angular.isDefined(newValue)) {
    // Do stuff with new slider value
  }
});

请注意,我们需要isDefined,因为每个手表都会在初始值未定义的范围编译时触发。

另一种方法是使用参数增强指令,该参数在滑块值更改时进行评估(很像回调函数)。

// sample directive code
angular.module('my-ui-controles', []).directive('mySlider', [function() {
  return {
    template: '...',
    scope: {
      value: '=mySlider',
      onChange: '&'
    },
    link: function(scope, elem, attrs) {
      // assume this is called when the slider value changes
      scope.changeValue = function(newValue) {
        // do other internal stuff and notify the outside world
        scope.onChange({value: newValue});
      }
    }
  }
}])

现在您可以像这样在模板中使用它:

<div my-slider="sliderValue" on-change="doStuff(value)"></div>

现在发生的情况是,一旦滑块值发生变化,我们就会评估传递给指令的 onChange 表达式。 doStuff 中的值填充了您的新滑块值。我们传递给onChange 的对象实际上是评估表达式的范围,doStuff 可以是控制器中的任何方法。

主要的好处是你有在你的指令中通知某人的逻辑,而不是通过一个手表在你的控制器中隐式通知。

希望这能让你朝着正确的方向前进。

【讨论】:

    【解决方案2】:

    如果您将任何变量传递给隔离范围,您可以在 both 两侧绑定它(在其上设置任何侦听器)。您可以使用 Angularjs 事件 发送任何信号,如果变量已更改。

    也许这篇文章可以帮助你。

    http://www.w3docs.com/snippets/angularjs/bind-variable-inside-angularjs-directive-isolated-scope.html

    http://www.w3docs.com/snippets/angularjs/change-variable-from-outside-of-directive.html

    【讨论】:

    • 我注意到您超过 50% 的帖子包含指向 w3docs.com 的链接,并且只有 4 个包含任何链接的帖子不指向 w3docs.com。如果您以任何方式隶属于 w3docs,那么您需要披露该隶属关系。
    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多