Javascript 如何根据服务更改更新指令?

Javascript 如何根据服务更改更新指令?,javascript,angularjs,angular-services,angular-directive,Javascript,Angularjs,Angular Services,Angular Directive,我有一个directiveparent指令,其中包含一个slidermySlider,在停止事件时,使用2个参数调用angular$resource服务,该服务返回一个对象。 指令结构: <parent-directive> <div ui-slider="slider.options" ng-model="mySlider" id="my-slider"> <span child-directive-one></span> <span ch

我有一个directiveparent指令,其中包含一个slidermySlider,在停止事件时,使用2个参数调用angular$resource服务,该服务返回一个对象。 指令结构:

<parent-directive>
<div ui-slider="slider.options" ng-model="mySlider" id="my-slider">
<span child-directive-one></span>
<span child-directive-two></span>
<span child-directive-three></span>
<div>
    <span child-directive-four></child-directive-four>
</div>
</parent-directive
每当用户拖动滑块时,就会使用不同的参数调用服务并重新生成新结果,在此基础上,我需要更新子指令

我有三个想法:

对所有子元素而不是指令使用ng模型,将它们绑定到父指令中控制器的作用域上; 第二个,我不知道怎么做,是在父指令中创建一个控制器,它从服务发送和接收数据,并将数据共享给子指令以更新它们。 最后一个是在服务中创建一个状态变量,并使用类似于第1点的控制器对其进行更新。请参见上面的内容,并使用$watch监视变量状态,当变量状态发生更改时,请更新子指令。 我应该如何进行

请在此处查看简要代码:

谢谢

ngModel用于双向绑定,即允许用户干预值的控件。从描述来看,它们似乎是仅显示组件。因此,我建议不要使用NGM模型

通常,子指令需要它们的父指令。这允许它们调用父控制器上的方法。您需要的恰恰相反:父控制器需要调用子控制器上的方法。可以这样做:子对象调用registerChild方法,父对象在需要调用时迭代所有已注册的子对象。我觉得这个实现很麻烦

服务为全球/单身。我会投票反对将服务实现与UI需求挂钩

我的建议与选项3的实现类似,但在父控制器持有数据的情况下:

1将要与子指令共享的数据放置在父控制器的成员变量中:

myApp.directive('parentDirective', ['myService', function(myService){
    ...
    controller: function($scope) {
        ...
        this.sharedThing = ...;
    }
}]);
共享内容可以在服务返回新数据时更新,或者在任何其他必要的时候更新

2让孩子们像你的选项2一样需要父母,并观察此属性:

myApp.directive('childDirectiveOne', function() {
    return {
        ...
        require: 'parentDirective',
        link: function(scope, elem, attrs, parentDirective) {
            scope.$watch(
                function() {
                    return parentDirective.sharedThing;
                },
                function(newval) {
                    // do something with the new value; most probably
                    // you want to place it in the scope
                }
            });
        }
    };
});

根据数据的性质,可能需要一个深度监视。

我按照您的建议实现了它,但我有6个子指令,这意味着6$watch方法该服务返回一个带有6个属性的obj,我在6个子指令中逐一使用了它们。为了获得更好的性能,我应该在ctrl上设置一个状态变量和一个对象变量来与指令共享它吗?在指令中要求只监视状态变量?但我认为这是行不通的。你怎么认为?这是你的建议上的代码:这个块是否重复了几十次?如果不是,多加几块手表应该不会影响性能。如果实际的逻辑和小提琴的逻辑一样简单,那么我也会考虑用隔离的范围来生成子指令,把数据传递到一个“=”属性中,并将模板绑定到那个范围属性。它也会在HOODS下创建一个表。谢谢你的答案,为什么我要用隔离的范围来做子指令呢?在=属性中传递数据?我是angular方面的新手,我了解到,只有当您希望从指令中的父DOM获取内容时,才会这样做。再次感谢!:隔离作用域是一种将数据传递给指令的正式方式,它不依赖于特定的父作用域。谢谢,但在我的例子中,我看不出应该如何使用=,可能是像scope:{}这样的空对象就足够了。如果我使用=这意味着还要在DOM中添加一个属性。我觉得我很傻,我不能在12小时内完成,只是今天它挡住了我的思路:谢谢!