代码之家  ›  专栏  ›  技术社区  ›  surrender_to_the_Now

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

  •  0
  • surrender_to_the_Now  · 技术社区  · 11 年前

    我有指令( parent-directive )包含滑块(mySlider) stop 事件,调用角度 $resource 带有2个参数的服务,服务返回一个对象。 指令结构:

    <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
    

    每当用户拖动滑块时,都会使用不同的参数调用服务并重新生成新结果,我需要根据它更新子指令。

    我想到了三种方法:

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

    我该如何继续?

    请在此处查看简短代码: http://jsfiddle.net/v5xL0dg9/2/

    谢谢

    1 回复  |  直到 11 年前
        1
  •  0
  •   Nikos Paraskevopoulos    11 年前
    1. ngModel 用于双向绑定,即允许用户干扰值的控件。从描述来看,它们似乎是仅显示的组件。所以我建议不要使用 NG模型 .

    2. 通常,子指令需要其父指令。这允许他们调用父控制器上的方法。您需要的是相反的:父控制器需要调用子控制器上的方法。可以这样做:孩子们称 registerChild() 方法,父级在需要调用所有已注册的子级时迭代它们。我觉得这个实现很麻烦。

    3. 服务是全局/单个的。我将投票反对将服务实现与UI需求挂钩。

    我的建议类似于选项3的实现,但父控制器持有数据:

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

    myApp.directive('parentDirective', ['myService', function(myService){
        ...
        controller: function($scope) {
            ...
            this.sharedThing = ...;
        }
    }]);
    

    这个 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
                    }
                });
            }
        };
    });
    

    根据数据的性质,可能需要进行深入观察。