2016-09-27 4 views
2

Я хочу создать $ watch в директиве к определенной части объекта json, но он, похоже, не принимает синтаксис (ошибок не появляется, но он никогда не входит в часы)

link: function (scope, element) { 
scope.JsonObject={ 
    profs:{ 
     prof1:[{ 
      name:example1a, 
      id:example1b 
     }], 
     prof2:[{ 
      name:example2a, 
      id:example2b 
     }] 
    } 
} 

scope.teachers=scope.JsonObject['profs'] 

//until here all ok 

for (var teacher in scope.teachers){ 
    //stuff to do 
    console.log("creating watch of " + teacher); 

    scope.$watch('teachers[teacher]', function() { //here seems to be the problem (it doesnt seem to accept JsonObject.teacher)  
    //stuff to do 

}, true); 
} 
+0

, что вы хотите достичь, создав часы внутри директивы, пожалуйста, понять, а также plunkr с кодом будет полезно разрешить ваш вопрос –

+0

, что я сделать, это вызвать плагин Highcharts: новый Highcharts.chart (учитель + "_id", диаграммы); но в этом случае я не думаю, что это актуально, проблема в том, что он никогда не входит в часы так или иначе –

+1

'JsonObject.teacher'' 'undefined', поэтому вы можете использовать' JsonObject.profs' или 'teacher.profs' –

ответ

1

Ранее teachers[teacher] был undefined, потому что не было ' ' (котировки) вокруг teacher.

for (var teacher in $scope.teachers){ 
    $scope.$watch("teachers['"+ teacher +"']", function(newValue, oldValue) { 
     alert("changed"); 
    }, true); 
} 
+0

Большое спасибо, это было то, что я искал. Однако, если кто-то новый в этом (как и я) и имеет такую ​​же проблему, важно знать, что: 1) Невозможно получить доступную переменную «учитель» внутри часов, так как значение могло быть изменено для время выполнения часов, используйте newValue, oldValue вместо этого 2) Не создавайте отладочные или контрольные точки внутри часов, так как он выдает сообщение об ошибке: основное исполнение ожидает бесконечное завершение часов (я думаю,). Вместо этого используйте трассировки для отладки, такие как console.log() –

1

Строка не проникает в объект.

function getTeacher(teacher) { 
    return $scope.teachers[teacher] 
} 

scope.$watch(getTeacher(teacher), function() { 
//Do stuff 
}, true);