【问题标题】:Sharing data between directives using attributes instead of services使用属性而不是服务在指令之间共享数据
【发布时间】:2013-07-31 09:35:30
【问题描述】:

我想创建一个指令,它本质上就像一个专门的输入字段。在一些逻辑和用户输入之后,“值”属性将填充一串以逗号分隔的时隙 (hh:mm)。

<time-slot value=""></time-slot>

变成

<time-slot value="01:00,02:00,03:00"></time-slot>

我想为任何人提供在“值”属性标记中放置范围引用的灵活性——无论何时更新属性值,范围引用也是如此。 (在下面的代码中,myModel.times 将在 MyController 范围内)。

<div ng-controller="MyController">
  <time-slot value="{{ myModel.times }}"></time-slot>
</div>

访问指令中的“值”属性没有问题。 但是,我还没有实现双向绑定——myModel.times 永远不会捕获更改的值,即使我在运行时检查元素时属性的内容已经更改。我正在使用 $attrs.$set 来更改 value 属性。

我不确定我是在概念上遗漏了什么,还是只是遗漏了一些额外的语法。为了保持这个指令的模块化和可共享性,我不想使用服务在控制器和指令之间共享数据,也不想使用级联范围。我认为如果 value 属性可以简单地由范围变量引用并根据需要使用,就像一个简单的输入标签一样,那将是最佳选择:

<input ng-model="model.someText"></input>

【问题讨论】:

  • 我不知道有可能以这种方式实现它 - 也许 $attrs.$set 只是覆盖属性值并删除插值 {{ myModel.times }}。但是你能在控制器作用域和这个孤立作用域之间使用具有隔离作用域和双向数据绑定的指令吗?
  • 在指令中,我认为您使用的是@ 范围而不是= 范围-因此这两个绑定不起作用-您尚未发布指令的代码,所以我可以只做假设...
  • 我意识到我的代码可能正在按照 Esa 规定的方式执行。使用 @ 和 = 的主要区别是什么?

标签: angularjs attributes angularjs-directive


【解决方案1】:

双向数据绑定示例:参见plunkr

angular.module('myApp', [])
  .directive('timeSlots', function() {        
    return {
      scope: { value: '=' },          
      link: function($scope, $elem, $attrs) {
        // you can access $scope.value here (after it has been interpolated)
      }
    };  
  })
  .controller('MainCtrl', ['$scope', function($scope) {
    $scope.value = 42;
  }]);

在 HTML 中:

<div ng-controller="MainCtrl">
  <time-slots value="value"></time-slots>      
</div>

【讨论】:

  • 这正是我想要的。起初我想知道控制器范围变量名称是否必须是“值”,因为指令范围指的是值:范围:{值:“=”},但这里的“值”是指属性名称,而不是范围变量.所以是的,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2018-10-12
  • 2013-02-25
  • 1970-01-01
  • 2016-07-30
相关资源
最近更新 更多