2016-02-28 3 views
3

Попытка реализовать JSON.stringify, как описано здесь: Hide certain values in output from JSON.stringify() и исключить некоторые поля из сериализации, но это не сработает.Почему моя функция замены в JSON.stringify (значение, replacer) не получает ключи в угловом приложении?

К примеру, в моем контроллере я имею следующий код:

.controller('ExampleController', ['$scope', function($scope) { 
    $scope.event = { 
     id:1, 
     title: 'event title', 
     users: [{ 
     id: 1, 
     name: 'Anatoly' 
     },{ 
     id: 2, 
     name: 'Roman' 
     }], 
     private1: 1, 
     private2: 2 
    }; 



    var replacer = function(key, value){ 
     console.log(key); 
    }; 

    $scope.stringified1 = JSON.stringify($scope.event, replacer); 

    // $scope.stringified = JSON.stringify($scope.event, ['id','title','users','name']); 

}]); 

console.log(key) Почему ничего не выводит? Вызывается сама функция, но параметр key пуст.

Я сделал plunker здесь: http://plnkr.co/edit/U6ZcIuPVr5RzMIBl8X6c?p=preview

Я использую Угловое 1.4.9 и Chrome 48.0.2564.116

P.S. Я выполнил эту функцию с переданным массивом, и это работает, но использование функции может дать гораздо большую гибкость, поэтому я хотел бы понять, почему она не работает.

+1

заменителя ничего не возвращает. Что ты пытаешься сделать? – charlietfl

+0

На самом деле вы помогли мне решить эту проблему, если я не вернусь при первом вызове любой ценности, он не будет вызван по следующим свойствам :) См. Обновленный плункер здесь: http://plnkr.co/edit/h9NU2xppeGuMSTfTyRng?p = предварительный просмотр и спасибо :) – Anatoly

ответ

1

Хорошо, это не ясно из инструкции здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify, но потому, что replacer называется в рекурсивно образом он должен возвращать объект, на котором она вызывается, сам корневой объект тоже:

Первоначально он вызывается с пустой ключ, представляющий объект быть строковой

вы должны вернуть этот объект, если вы не вернетесь ничего не будет называться на другие свойства этого объекта

и затем вызывается для каждого свойства на объект или массив быть строковой

Так, благодаря @charlietfl намек, я установил его, вы можете увидеть неподвижную plunker здесь: http://plnkr.co/edit/a3S8yGx78b7vJSKwORw5?p=preview