0

鉴于以下情况:

<div data-ng-repeat="val in vals">
      <div data-ng-class:{'myClass':isEngineOn(val)}>
          <span data-ng-show="isEngineOn(val)">yeah it's on</span>
          <span data-ng-show="!isEngineOn(val)"> standby</span>
          <button data-ng-disabled="isEngineOn(val)">Start engine</button>
      <div>
</div>

isEngineOn 随我从服务器收到的 websocket 消息而变化。

有没有办法避免在每个摘要期间评估 isEngineOn,4 次,每个重复值?诸如初始化变量之类的东西?

4

3 回答 3

1

您可以使用简单的 CSS 来做到这一点,而无需在 span 中调用该函数。我认为这比 JavaScript 解决方案更有效,尤其是当您重复许多元素时,因为您可以保存绑定:

<div data-ng-repeat="val in vals">
    <div data-ng-class:{'myClass':isEngineOn(val)}>
        <span class="showWhenOn">yeah it's on</span>
        <span class="showWhenOff"> standby</span>
        <button onclick="alert('Starting...')">Start engine</button>
    </div>
</div>

CSS:

.showWhenOn {
    display: none;
}

.myClass .showWhenOn {
    display: inline;
}

.myClass .showWhenOff {
    display: none;
}

.myClass button {
    pointer-events: none;
    color: silver;
}

JS小提琴

于 2015-02-15T16:26:52.650 回答
0

是的,只需在控制器中有一个变量来保存结果,并在您收到来自服务器的更新时更新该变量:

在您的控制器中:

$scope.engineOn = isEngineOn();//also make sure to update from server whenever you need

请注意,如果isEngineOn()不再从视图调用您的函数,则它不需要在范围内,它可以声明为常规变量。

HTML:

<div data-ng-class="{'myClass':engineOn}">
      <span data-ng-show="engineOn">yeah it's on</span>
      <span data-ng-show="!engineOn"> standby</span>
<div>

编辑2ng-init正如你所说,没有更新摘要,所以我采取了第二种方法。

我已经走了很长一段路,并为您的值创建了一个相应的数组,您可以从中读取:

  <div data-ng-repeat="val in vals" >
      <div data-ng-class="{'myClass':enginOn[val]}">
          <span data-ng-show="engineOn[val]">yeah it's on</span>
          <span data-ng-show="!engineOn[val]"> standby</span>
          <button data-ng-disabled="isEngineOn(val)">Start engine</button>
      </div>
</div>

小提琴

于 2015-02-15T16:22:44.257 回答
0

您可以将观察者设置为当您从服务器接收到答案时更改的变量,例如:

scope.$watch(function(){ return <var that changes>; }, function(oldv, newv){
    if(oldv !== newv)
        scope.isEngineOn = <Calculate here>;
});

然后使用:

<span data-ng-show="isEngineOn">
于 2015-02-15T16:24:07.240 回答