Javascript 将变量从控制器传递到指令';s隔离作用域,而不将其添加到父级';s范围
抱歉,如果标题不是最准确的。。 那么,我想做什么,以及背后的原因是什么。我有一个非常庞大的条目列表,最多400个条目,我从ajax请求中获得这个列表,现在如果第一个条目具有运行的Javascript 将变量从控制器传递到指令';s隔离作用域,而不将其添加到父级';s范围,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,抱歉,如果标题不是最准确的。。 那么,我想做什么,以及背后的原因是什么。我有一个非常庞大的条目列表,最多400个条目,我从ajax请求中获得这个列表,现在如果第一个条目具有运行的属性,我想从列表中提取它(通过使用splice()),并将它传递给一个指令,该指令可以在一个独立的范围内处理它。为什么?因为正在运行的条目上会有一个计时器,它会使用$timeout每秒向其中一个属性添加+1 现在我希望它是孤立的,因为这我不希望过滤器和列表上的所有不运行的条目被调用每一秒,只是因为一些东西(特别是计时器)
属性,我想从列表中提取它(通过使用splice()
),并将它传递给一个指令,该指令可以在一个独立的范围内处理它。为什么?因为正在运行的条目上会有一个计时器,它会使用$timeout
每秒向其中一个属性添加+1
现在我希望它是孤立的,因为这我不希望过滤器和列表上的所有不运行的条目被调用每一秒,只是因为一些东西(特别是计时器)在运行的条目上改变
现在,当我按下save或其他按钮时,我想将正在运行的条目放回条目中,只使用running:false
Now
我知道如何从父对象继承对象,并在指令上从它创建一个独立的作用域-
通过这种方式传递它似乎并不理想,但我被告知这很好,没有什么真正违背最佳实践的
现在问题来了
有没有办法在不将指令添加到作用域的情况下传递“running”指令,因为一旦它被复制,它在那里几乎是无用的
- 我是否应该寻找一种在不将其添加到范围的情况下传递它的方法
- 或者我应该在它被复制后删除它
- 或者我应该离开它,因为它不重要
如果使用ajax设置条目
,则不可能复制正在运行的条目,因为它尚未设置-
- 指令中是否应该有
$watch
- 或者我应该使用广播/打开?像这样
- 还是我完全做错了
谢谢 如果你想传递一个完整的文本对象,你必须使用“=”,但是如果你想使用@,你必须使用$eval
<!doctype html>
<html ng-app="plunker" >
<head>
<meta charset="utf-8">
<title>AngularJS Plunker</title>
<link rel="stylesheet" href="style.css">
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.min.js"></script>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<input ng-model="obj.name">
<my-directive obj="obj" title="{{title}}">
</my-directive>
<script type="text/javascript">
var app = angular.module('plunker', []);
app.controller('MainCtrl', function ($scope) {
$scope.obj = { name: "John", surname: "Doe" };
$scope.title = { name: 'abc' };
});
app.directive('myDirective', function () {
return {
restrict: 'E',
template: "<div><span>{{obj.name}}<span><span>{{title}}<span></div>",
replace: true,
scope: { title: '@', obj: '=' },
link: function (scope, element, attrs) {
attrs.$observe('title', function (value) {
alert(scope.$eval(value).name);
})
}
}
})
</script>
</body>
</html>
安古拉斯普朗克
var app=angular.module('plunker',[]);
应用程序控制器('MainCtrl',函数($scope){
$scope.obj={姓名:“约翰”,姓氏:“多伊”};
$scope.title={name:'abc'};
});
app.directive('myDirective',function(){
返回{
限制:'E',
模板:“{{obj.name}}{{title}}”,
替换:正确,
作用域:{title:'@',obj:'='},
链接:函数(范围、元素、属性){
属性$observe('title',函数(值){
警报(范围$eval(值).name);
})
}
}
})
将您的指令更改为scope:true-这将被隔离,但会继承父级
app.directive('myDirective', function($timeout) {
return {
restrict: 'E',
scope: true,
link: function(scope, element, attrs) {
scope.timer = 0;
$timeout(function tick() {
scope.timer = scope.timer+1;
$timeout(tick, 1000);
});
}
}
})
然后在您的指令中,只需像在父范围中一样使用它
<my-directive>
<h4>"running" entry on directive in isolated scope</h4>
<p>Timer: {{timer}}</p>
{{ running | json }}<br/>
<input type="text" ng-model="running.name" />
</my-directive>
独立作用域中指令上的“正在运行”项
计时器:{{Timer}}
{{running | json}}
如果要将变量从控制器传递到指令,则必须在作用域内设置属性并使用属性,如作用域:{entry:'@items'}有关详细说明,请参见@不适用于对象,请看,我仍然需要将正在运行的条目添加到作用域中,才能将其传递到目录。它不是真的,请在htmlhow中使用下面的代码。它不是真的吗,在您的示例中,您只传递一个带名称的字符串。我需要的远不止名称,条目至少还有5个其他属性,这就是为什么我想传递整个entry对象的原因。我以为你只想传递一个属性来获得完整的文本。请使用=属性=将设置双向绑定,不是吗?这对我来说也不好,我不希望指令的作用域影响父作用域。原因在我问题的第二段中。然后您必须在指令中使用scope.eval。另一种方法是观察上面编辑的属性更改